Compare commits
3 Commits
main
...
feature/Ca
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6db85bfa39 | ||
|
|
03c9ac1e11 | ||
|
|
1ee0063b62 |
@@ -39,7 +39,6 @@
|
||||
<PackageVersion Include="Nito.AsyncEx" Version="5.1.2" />
|
||||
<PackageVersion Include="Nito.AsyncEx.Tasks" Version="5.1.2" />
|
||||
<PackageVersion Include="NodaTime" Version="3.2.2" />
|
||||
<PackageVersion Include="Sentry.Serilog" Version="5.12.0" />
|
||||
<PackageVersion Include="Serilog" Version="4.2.0" />
|
||||
<PackageVersion Include="Serilog.Exceptions" Version="8.4.0" />
|
||||
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
|
||||
|
||||
@@ -9,12 +9,11 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommunityToolkit.Diagnostics" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" />
|
||||
<PackageReference Include="Google.Apis.Auth" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" />
|
||||
<PackageReference Include="Google.Apis.Auth" />
|
||||
<PackageReference Include="Microsoft.Identity.Client" />
|
||||
<PackageReference Include="Microsoft.Identity.Client.Broker" />
|
||||
<PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="Microsoft.Identity.Client.Broker" />
|
||||
<PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" />
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
@@ -141,6 +142,16 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel
|
||||
Type = CalendarSynchronizationType.CalendarMetadata
|
||||
};
|
||||
|
||||
var timer = new Stopwatch();
|
||||
|
||||
var synchronizationResponse = await WinoServerConnectionManager.GetResponseAsync<CalendarSynchronizationResult, NewCalendarSynchronizationRequested>(new NewCalendarSynchronizationRequested(synchronizationOptions, SynchronizationSource.Client));
|
||||
|
||||
timer.Stop();
|
||||
|
||||
Debug.WriteLine("Synchronization completed in {timer.ElapsedMilliseconds} ms");
|
||||
|
||||
// TODO: Properly handle synchronization errors.
|
||||
|
||||
accountCreationDialog.Complete(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,6 +127,7 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
private readonly ICalendarService _calendarService;
|
||||
private readonly INavigationService _navigationService;
|
||||
private readonly IKeyPressService _keyPressService;
|
||||
private readonly ICalendarServiceEx _calendarServiceEx;
|
||||
private readonly IPreferencesService _preferencesService;
|
||||
|
||||
// Store latest rendered options.
|
||||
@@ -146,6 +147,7 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
ICalendarService calendarService,
|
||||
INavigationService navigationService,
|
||||
IKeyPressService keyPressService,
|
||||
ICalendarServiceEx calendarServiceEx,
|
||||
IAccountCalendarStateService accountCalendarStateService,
|
||||
IPreferencesService preferencesService)
|
||||
{
|
||||
@@ -155,6 +157,7 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
_calendarService = calendarService;
|
||||
_navigationService = navigationService;
|
||||
_keyPressService = keyPressService;
|
||||
_calendarServiceEx = calendarServiceEx;
|
||||
_preferencesService = preferencesService;
|
||||
|
||||
AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested;
|
||||
@@ -235,23 +238,6 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
[RelayCommand(AllowConcurrentExecutions = false, CanExecute = nameof(CanSaveQuickEvent))]
|
||||
private async Task SaveQuickEventAsync()
|
||||
{
|
||||
var durationSeconds = (QuickEventEndTime - QuickEventStartTime).TotalSeconds;
|
||||
|
||||
var testCalendarItem = new CalendarItem
|
||||
{
|
||||
CalendarId = SelectedQuickEventAccountCalendar.Id,
|
||||
StartDate = QuickEventStartTime,
|
||||
DurationInSeconds = durationSeconds,
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
Description = string.Empty,
|
||||
Location = Location,
|
||||
Title = EventName,
|
||||
Id = Guid.NewGuid()
|
||||
};
|
||||
|
||||
IsQuickEventDialogOpen = false;
|
||||
await _calendarService.CreateNewCalendarItemAsync(testCalendarItem, null);
|
||||
|
||||
// TODO: Create the request with the synchronizer.
|
||||
}
|
||||
|
||||
@@ -635,10 +621,13 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
// Check all the events for the given date range and calendar.
|
||||
// Then find the day representation for all the events returned, and add to the collection.
|
||||
|
||||
var events = await _calendarService.GetCalendarEventsAsync(calendarViewModel, dayRangeRenderModel).ConfigureAwait(false);
|
||||
var events = await _calendarServiceEx.GetExpandedEventsInDateRangeWithExceptionsAsync(dayRangeRenderModel.Period.Start, dayRangeRenderModel.Period.End, calendarViewModel.AccountCalendar).ConfigureAwait(false);
|
||||
|
||||
foreach (var @event in events)
|
||||
{
|
||||
// TODO: Do it in the service.
|
||||
@event.AssignedCalendar = calendarViewModel.AccountCalendar;
|
||||
|
||||
// Find the days that the event falls into.
|
||||
var allDaysForEvent = dayRangeRenderModel.CalendarDays.Where(a => a.Period.OverlapsWith(@event.Period));
|
||||
|
||||
@@ -800,19 +789,18 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
// Recurring events must be selected as a single instance.
|
||||
// We need to find the day that the event is in, and then select the event.
|
||||
|
||||
if (!calendarItemViewModel.IsRecurringEvent)
|
||||
{
|
||||
return [calendarItemViewModel];
|
||||
}
|
||||
else
|
||||
{
|
||||
return DayRanges
|
||||
.SelectMany(a => a.CalendarDays)
|
||||
.Select(b => b.EventsCollection.GetCalendarItem(calendarItemViewModel.Id))
|
||||
.Where(c => c != null)
|
||||
.Cast<CalendarItemViewModel>()
|
||||
.Distinct();
|
||||
}
|
||||
if (calendarItemViewModel == null) return Enumerable.Empty<CalendarItemViewModel>();
|
||||
|
||||
// If the calendar item is not recurring, we can just return it.
|
||||
|
||||
if (calendarItemViewModel.ItemType == CalendarItemType.Timed || calendarItemViewModel.ItemType == CalendarItemType.RecurringException) return new[] { calendarItemViewModel };
|
||||
|
||||
return DayRanges
|
||||
.SelectMany(a => a.CalendarDays)
|
||||
.Select(b => b.EventsCollection.GetCalendarItem(calendarItemViewModel.Id))
|
||||
.Where(c => c != null)
|
||||
.Cast<CalendarItemViewModel>()
|
||||
.Distinct();
|
||||
}
|
||||
|
||||
private void UnselectCalendarItem(CalendarItemViewModel calendarItemViewModel, CalendarDayModel calendarDay = null)
|
||||
@@ -821,6 +809,8 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
|
||||
var itemsToUnselect = GetCalendarItems(calendarItemViewModel, calendarDay);
|
||||
|
||||
if (itemsToUnselect == null) return;
|
||||
|
||||
foreach (var item in itemsToUnselect)
|
||||
{
|
||||
item.IsSelected = false;
|
||||
@@ -833,6 +823,8 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
||||
|
||||
var itemsToSelect = GetCalendarItems(calendarItemViewModel, calendarDay);
|
||||
|
||||
if (itemsToSelect == null) return;
|
||||
|
||||
foreach (var item in itemsToSelect)
|
||||
{
|
||||
item.IsSelected = true;
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Diagnostics;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Itenso.TimePeriod;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
|
||||
namespace Wino.Calendar.ViewModels.Data;
|
||||
@@ -17,28 +19,73 @@ public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, IC
|
||||
|
||||
public IAccountCalendar AssignedCalendar => CalendarItem.AssignedCalendar;
|
||||
|
||||
public DateTime StartDate { get => CalendarItem.StartDate; set => CalendarItem.StartDate = value; }
|
||||
public DateTime StartDateTime { get => CalendarItem.StartDateTime; set => CalendarItem.StartDateTime = value; }
|
||||
|
||||
public DateTime EndDate => CalendarItem.EndDate;
|
||||
public DateTime EndDateTime => CalendarItem.EndDateTime;
|
||||
|
||||
public double DurationInSeconds { get => CalendarItem.DurationInSeconds; set => CalendarItem.DurationInSeconds = value; }
|
||||
/// <summary>
|
||||
/// Gets the start date and time in the local time zone for display purposes.
|
||||
/// </summary>
|
||||
public DateTime LocalStartDateTime => ConvertToLocalTime();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the end date and time in the local time zone for display purposes.
|
||||
/// </summary>
|
||||
public DateTime LocalEndDateTime => ConvertToLocalTime();
|
||||
|
||||
public ITimePeriod Period => CalendarItem.Period;
|
||||
|
||||
public bool IsAllDayEvent => CalendarItem.IsAllDayEvent;
|
||||
public bool IsMultiDayEvent => CalendarItem.IsMultiDayEvent;
|
||||
public bool IsRecurringEvent => CalendarItem.IsRecurringEvent;
|
||||
public bool IsRecurringChild => CalendarItem.IsRecurringChild;
|
||||
public bool IsRecurringParent => CalendarItem.IsRecurringParent;
|
||||
public bool IsRecurringEvent => !string.IsNullOrEmpty(CalendarItem.RecurrenceRules) || !string.IsNullOrEmpty(CalendarItem.RecurringEventId);
|
||||
|
||||
[ObservableProperty]
|
||||
private bool _isSelected;
|
||||
|
||||
public ObservableCollection<CalendarEventAttendee> Attendees { get; } = new ObservableCollection<CalendarEventAttendee>();
|
||||
|
||||
public CalendarItemType ItemType => CalendarItem.ItemType;
|
||||
|
||||
public CalendarItemViewModel(CalendarItem calendarItem)
|
||||
{
|
||||
CalendarItem = calendarItem;
|
||||
|
||||
Debug.WriteLine($"{Title} : {ItemType}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a DateTime to local time based on the provided timezone.
|
||||
/// If timezone is empty or null, assumes the DateTime is in UTC.
|
||||
/// </summary>
|
||||
/// <param name="dateTime">The DateTime to convert</param>
|
||||
/// <param name="timeZone">The timezone string. If empty/null, assumes UTC.</param>
|
||||
/// <returns>DateTime converted to local time</returns>
|
||||
private DateTime ConvertToLocalTime()
|
||||
{
|
||||
// All day events ignore time zones and are treated as local time.
|
||||
if (ItemType == CalendarItemType.AllDay || ItemType == CalendarItemType.MultiDayAllDay || ItemType == CalendarItemType.RecurringAllDay)
|
||||
return CalendarItem.StartDateTime;
|
||||
|
||||
if (string.IsNullOrEmpty(CalendarItem.TimeZone))
|
||||
{
|
||||
// If no timezone specified, assume it's UTC and convert to local time
|
||||
return DateTime.SpecifyKind(CalendarItem.StartDateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Parse the timezone and convert to local time
|
||||
var sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(CalendarItem.TimeZone);
|
||||
return TimeZoneInfo.ConvertTimeToUtc(CalendarItem.StartDateTime, sourceTimeZone).ToLocalTime();
|
||||
}
|
||||
catch (TimeZoneNotFoundException)
|
||||
{
|
||||
// If timezone is not found, fallback to treating as UTC
|
||||
return DateTime.SpecifyKind(CalendarItem.StartDateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
catch (InvalidTimeZoneException)
|
||||
{
|
||||
// If timezone is invalid, fallback to treating as UTC
|
||||
return DateTime.SpecifyKind(CalendarItem.StartDateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString() => CalendarItem.Title;
|
||||
|
||||
@@ -31,7 +31,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
[ObservableProperty]
|
||||
private CalendarItemViewModel _seriesParent;
|
||||
|
||||
public bool CanViewSeries => CurrentEvent?.IsRecurringChild ?? false;
|
||||
public bool CanViewSeries => false; //CurrentEvent?.IsRecurringChild ?? false; // TODO: Implement this properly
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -67,7 +67,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
|
||||
CurrentEvent = new CalendarItemViewModel(currentEventItem);
|
||||
|
||||
var attendees = await _calendarService.GetAttendeesAsync(currentEventItem.EventTrackingId);
|
||||
var attendees = await _calendarService.GetAttendeesAsync(currentEventItem.Id);
|
||||
|
||||
foreach (var item in attendees)
|
||||
{
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
VerticalAlignment="Top"
|
||||
Orientation="Horizontal"
|
||||
Spacing="6">
|
||||
<controls:WinoFontIcon
|
||||
<!--<controls:WinoFontIcon
|
||||
FontSize="12"
|
||||
Foreground="{x:Bind helpers:XamlHelpers.GetReadableTextColor(CalendarItem.AssignedCalendar.BackgroundColorHex), Mode=OneWay}"
|
||||
Icon="CalendarEventRepeat"
|
||||
@@ -79,7 +79,7 @@
|
||||
FontSize="12"
|
||||
Foreground="{x:Bind helpers:XamlHelpers.GetReadableTextColor(CalendarItem.AssignedCalendar.BackgroundColorHex), Mode=OneWay}"
|
||||
Icon="CalendarEventMuiltiDay"
|
||||
Visibility="{x:Bind CalendarItem.IsMultiDayEvent, Mode=OneWay}" />
|
||||
Visibility="{x:Bind CalendarItem.IsMultiDayEvent, Mode=OneWay}" />-->
|
||||
</StackPanel>
|
||||
|
||||
<VisualStateManager.VisualStateGroups>
|
||||
|
||||
@@ -7,6 +7,7 @@ using Windows.UI.Xaml.Input;
|
||||
using Wino.Calendar.ViewModels.Data;
|
||||
using Wino.Calendar.ViewModels.Messages;
|
||||
using Wino.Core.Domain;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
namespace Wino.Calendar.Controls;
|
||||
@@ -90,7 +91,9 @@ public sealed partial class CalendarItemControl : UserControl
|
||||
if (CalendarItem == null) return;
|
||||
if (DisplayingDate == null) return;
|
||||
|
||||
if (CalendarItem.IsMultiDayEvent)
|
||||
bool isMultiDayEvent = CalendarItem.CalendarItem.ItemType == CalendarItemType.MultiDay || CalendarItem.CalendarItem.ItemType == CalendarItemType.MultiDayAllDay;
|
||||
|
||||
if (isMultiDayEvent)
|
||||
{
|
||||
// Multi day events are divided into 3 categories:
|
||||
// 1. All day events
|
||||
@@ -103,14 +106,14 @@ public sealed partial class CalendarItemControl : UserControl
|
||||
periodRelation == PeriodRelation.EnclosingStartTouching)
|
||||
{
|
||||
// hour -> title
|
||||
CalendarItemTitle = $"{DisplayingDate.CalendarRenderOptions.CalendarSettings.GetTimeString(CalendarItem.StartDate.TimeOfDay)} -> {CalendarItem.Title}";
|
||||
CalendarItemTitle = $"{DisplayingDate.CalendarRenderOptions.CalendarSettings.GetTimeString(CalendarItem.StartDateTime.TimeOfDay)} -> {CalendarItem.Title}";
|
||||
}
|
||||
else if (
|
||||
periodRelation == PeriodRelation.EndInside ||
|
||||
periodRelation == PeriodRelation.EnclosingEndTouching)
|
||||
{
|
||||
// title <- hour
|
||||
CalendarItemTitle = $"{CalendarItem.Title} <- {DisplayingDate.CalendarRenderOptions.CalendarSettings.GetTimeString(CalendarItem.EndDate.TimeOfDay)}";
|
||||
CalendarItemTitle = $"{CalendarItem.Title} <- {DisplayingDate.CalendarRenderOptions.CalendarSettings.GetTimeString(CalendarItem.EndDateTime.TimeOfDay)}";
|
||||
}
|
||||
else if (periodRelation == PeriodRelation.Enclosing)
|
||||
{
|
||||
@@ -139,11 +142,11 @@ public sealed partial class CalendarItemControl : UserControl
|
||||
{
|
||||
if (CalendarItem == null) return;
|
||||
|
||||
if (CalendarItem.IsAllDayEvent)
|
||||
if (CalendarItem.CalendarItem.ItemType == CalendarItemType.AllDay)
|
||||
{
|
||||
VisualStateManager.GoToState(this, "AllDayEvent", true);
|
||||
}
|
||||
else if (CalendarItem.IsMultiDayEvent)
|
||||
else if (CalendarItem.CalendarItem.ItemType == CalendarItemType.MultiDayAllDay || CalendarItem.CalendarItem.ItemType == CalendarItemType.MultiDay)
|
||||
{
|
||||
if (IsCustomEventArea)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,7 @@ using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
using Wino.Calendar.Models;
|
||||
using Wino.Calendar.ViewModels.Data;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
|
||||
namespace Wino.Calendar.Controls;
|
||||
@@ -44,9 +45,9 @@ public partial class WinoCalendarPanel : Panel
|
||||
|
||||
private void ResetMeasurements() => _measurements.Clear();
|
||||
|
||||
private double GetChildTopMargin(ICalendarItem calendarItemViewModel, double availableHeight)
|
||||
private double GetChildTopMargin(ICalendarItemViewModel calendarItemViewModel, double availableHeight)
|
||||
{
|
||||
var childStart = calendarItemViewModel.StartDate;
|
||||
var childStart = calendarItemViewModel.LocalStartDateTime;
|
||||
|
||||
if (childStart <= Period.Start)
|
||||
{
|
||||
@@ -68,10 +69,10 @@ public partial class WinoCalendarPanel : Panel
|
||||
private double GetChildLeftMargin(CalendarItemMeasurement calendarItemMeasurement, double availableWidth)
|
||||
=> availableWidth * calendarItemMeasurement.Left;
|
||||
|
||||
private double GetChildHeight(ICalendarItem child)
|
||||
private double GetChildHeight(ICalendarItemViewModel child)
|
||||
{
|
||||
// All day events are not measured.
|
||||
if (child.IsAllDayEvent) return 0;
|
||||
if (child.ItemType == CalendarItemType.AllDay) return 0;
|
||||
|
||||
double childDurationInMinutes = 0d;
|
||||
double availableHeight = HourHeight * 24;
|
||||
@@ -80,7 +81,7 @@ public partial class WinoCalendarPanel : Panel
|
||||
|
||||
// Debug.WriteLine($"Render relation of {child.Title} ({child.Period.Start} - {child.Period.End}) is {periodRelation} with {Period.Start.Day}");
|
||||
|
||||
if (!child.IsMultiDayEvent)
|
||||
if (child.ItemType != CalendarItemType.MultiDay || child.ItemType != CalendarItemType.MultiDayAllDay)
|
||||
{
|
||||
childDurationInMinutes = child.Period.Duration.TotalMinutes;
|
||||
}
|
||||
@@ -127,7 +128,7 @@ public partial class WinoCalendarPanel : Panel
|
||||
foreach (var control in calendarControls)
|
||||
{
|
||||
// We can't arrange this child.
|
||||
if (!(control.Content is ICalendarItem child)) continue;
|
||||
if (!(control.Content is ICalendarItemViewModel child)) continue;
|
||||
|
||||
bool isHorizontallyLastItem = false;
|
||||
|
||||
@@ -160,7 +161,7 @@ public partial class WinoCalendarPanel : Panel
|
||||
double extraRightMargin = 0;
|
||||
|
||||
// Multi-day events don't have any margin and their hit test is disabled.
|
||||
if (!child.IsMultiDayEvent)
|
||||
if (child.ItemType != CalendarItemType.MultiDay || child.ItemType != CalendarItemType.MultiDayAllDay)
|
||||
{
|
||||
// Max of 5% of the width or 20px max.
|
||||
extraRightMargin = isHorizontallyLastItem ? Math.Max(LastItemRightExtraMargin, finalSize.Width * 5 / 100) : 0;
|
||||
@@ -168,8 +169,10 @@ public partial class WinoCalendarPanel : Panel
|
||||
|
||||
if (childWidth < 0) childWidth = 1;
|
||||
|
||||
bool isAllOrMultiDayEvent = child.ItemType == CalendarItemType.AllDay || child.ItemType == CalendarItemType.MultiDay || child.ItemType == CalendarItemType.MultiDayAllDay;
|
||||
|
||||
// Regular events must have 2px margin
|
||||
if (!child.IsMultiDayEvent && !child.IsAllDayEvent)
|
||||
if (!isAllOrMultiDayEvent)
|
||||
{
|
||||
childLeft += 2;
|
||||
childTop += 2;
|
||||
@@ -211,10 +214,12 @@ public partial class WinoCalendarPanel : Panel
|
||||
var columns = new List<List<ICalendarItem>>();
|
||||
DateTime? lastEventEnding = null;
|
||||
|
||||
foreach (var ev in events.OrderBy(ev => ev.StartDate).ThenBy(ev => ev.EndDate))
|
||||
foreach (var ev in events.OrderBy(ev => ev.StartDateTime).ThenBy(ev => ev.EndDateTime))
|
||||
{
|
||||
// Multi-day events are not measured.
|
||||
if (ev.IsMultiDayEvent) continue;
|
||||
bool isMultiDayEvent = ev.ItemType == CalendarItemType.MultiDay || ev.ItemType == CalendarItemType.MultiDayAllDay;
|
||||
|
||||
if (isMultiDayEvent) continue;
|
||||
|
||||
if (ev.Period.Start >= lastEventEnding)
|
||||
{
|
||||
|
||||
@@ -22,6 +22,7 @@ public static class CalendarXamlHelpers
|
||||
/// </summary>
|
||||
public static string GetEventDetailsDateString(CalendarItemViewModel calendarItemViewModel, CalendarSettings settings)
|
||||
{
|
||||
// TODO: This is not correct.
|
||||
if (calendarItemViewModel == null || settings == null) return string.Empty;
|
||||
|
||||
var start = calendarItemViewModel.Period.Start;
|
||||
@@ -30,7 +31,7 @@ public static class CalendarXamlHelpers
|
||||
string timeFormat = settings.DayHeaderDisplayType == DayHeaderDisplayType.TwelveHour ? "h:mm tt" : "HH:mm";
|
||||
string dateFormat = settings.DayHeaderDisplayType == DayHeaderDisplayType.TwelveHour ? "dddd, dd MMMM h:mm tt" : "dddd, dd MMMM HH:mm";
|
||||
|
||||
if (calendarItemViewModel.IsMultiDayEvent)
|
||||
if (calendarItemViewModel.CalendarItem.ItemType == CalendarItemType.MultiDay || calendarItemViewModel.CalendarItem.ItemType == CalendarItemType.MultiDayAllDay)
|
||||
{
|
||||
return $"{start.ToString($"dd MMMM ddd {timeFormat}", settings.CultureInfo)} - {end.ToString($"dd MMMM ddd {timeFormat}", settings.CultureInfo)}";
|
||||
}
|
||||
@@ -42,54 +43,14 @@ public static class CalendarXamlHelpers
|
||||
|
||||
public static string GetRecurrenceString(CalendarItemViewModel calendarItemViewModel)
|
||||
{
|
||||
if (calendarItemViewModel == null || !calendarItemViewModel.IsRecurringChild) return string.Empty;
|
||||
|
||||
// Parse recurrence rules
|
||||
var calendarEvent = new CalendarEvent
|
||||
{
|
||||
Start = new CalDateTime(calendarItemViewModel.StartDate),
|
||||
End = new CalDateTime(calendarItemViewModel.EndDate),
|
||||
};
|
||||
|
||||
var recurrenceLines = Regex.Split(calendarItemViewModel.CalendarItem.Recurrence, Constants.CalendarEventRecurrenceRuleSeperator);
|
||||
|
||||
foreach (var line in recurrenceLines)
|
||||
{
|
||||
calendarEvent.RecurrenceRules.Add(new RecurrencePattern(line));
|
||||
}
|
||||
|
||||
if (calendarEvent.RecurrenceRules == null || !calendarEvent.RecurrenceRules.Any())
|
||||
{
|
||||
return "No recurrence pattern.";
|
||||
}
|
||||
|
||||
var recurrenceRule = calendarEvent.RecurrenceRules.First();
|
||||
var daysOfWeek = string.Join(", ", recurrenceRule.ByDay.Select(day => day.DayOfWeek.ToString()));
|
||||
string timeZone = calendarEvent.DtStart.TzId ?? "UTC";
|
||||
|
||||
return $"Every {daysOfWeek}, effective {calendarEvent.DtStart.Value.ToShortDateString()} " +
|
||||
$"from {calendarEvent.DtStart.Value.ToShortTimeString()} to {calendarEvent.DtEnd.Value.ToShortTimeString()} " +
|
||||
$"{timeZone}.";
|
||||
// TODO
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public static string GetDetailsPopupDurationString(CalendarItemViewModel calendarItemViewModel, CalendarSettings settings)
|
||||
{
|
||||
if (calendarItemViewModel == null || settings == null) return string.Empty;
|
||||
|
||||
// Single event in a day.
|
||||
if (!calendarItemViewModel.IsAllDayEvent && !calendarItemViewModel.IsMultiDayEvent)
|
||||
{
|
||||
return $"{calendarItemViewModel.Period.Start.ToString("d", settings.CultureInfo)} {settings.GetTimeString(calendarItemViewModel.Period.Duration)}";
|
||||
}
|
||||
else if (calendarItemViewModel.IsMultiDayEvent)
|
||||
{
|
||||
return $"{calendarItemViewModel.Period.Start.ToString("d", settings.CultureInfo)} - {calendarItemViewModel.Period.End.ToString("d", settings.CultureInfo)}";
|
||||
}
|
||||
else
|
||||
{
|
||||
// All day event.
|
||||
return $"{calendarItemViewModel.Period.Start.ToString("d", settings.CultureInfo)} ({Translator.CalendarItemAllDay})";
|
||||
}
|
||||
// TODO
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public static PopupPlacementMode GetDesiredPlacementModeForEventsDetailsPopup(
|
||||
@@ -98,8 +59,12 @@ public static class CalendarXamlHelpers
|
||||
{
|
||||
if (calendarItemViewModel == null) return PopupPlacementMode.Auto;
|
||||
|
||||
bool isAllDayOrMultiDay = calendarItemViewModel.CalendarItem.ItemType == CalendarItemType.MultiDay ||
|
||||
calendarItemViewModel.CalendarItem.ItemType == CalendarItemType.AllDay ||
|
||||
calendarItemViewModel.CalendarItem.ItemType == CalendarItemType.MultiDayAllDay;
|
||||
|
||||
// All and/or multi day events always go to the top of the screen.
|
||||
if (calendarItemViewModel.IsAllDayEvent || calendarItemViewModel.IsMultiDayEvent) return PopupPlacementMode.Bottom;
|
||||
if (isAllDayOrMultiDay) return PopupPlacementMode.Bottom;
|
||||
|
||||
return XamlHelpers.GetPlaccementModeForCalendarType(calendarDisplayType);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@ public partial class CustomAreaCalendarItemSelector : DataTemplateSelector
|
||||
{
|
||||
if (item is CalendarItemViewModel calendarItemViewModel)
|
||||
{
|
||||
return calendarItemViewModel.IsMultiDayEvent ? MultiDayTemplate : AllDayTemplate;
|
||||
return calendarItemViewModel.CalendarItem.ItemType == Core.Domain.Enums.CalendarItemType.MultiDay ||
|
||||
calendarItemViewModel.CalendarItem.ItemType == Core.Domain.Enums.CalendarItemType.MultiDayAllDay ? MultiDayTemplate : AllDayTemplate;
|
||||
}
|
||||
|
||||
return base.SelectTemplateCore(item, container);
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center"
|
||||
BorderBrush="Transparent"
|
||||
IsTabStop="False"
|
||||
PlaceholderText="Search" />
|
||||
|
||||
<StackPanel
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
<PersonPicture
|
||||
Width="40"
|
||||
Height="40"
|
||||
DisplayName="{x:Bind Name}" />
|
||||
DisplayName="{x:Bind DisplayName}" />
|
||||
|
||||
<!-- TODO: Organizer -->
|
||||
<Grid Grid.Column="1">
|
||||
@@ -265,7 +265,7 @@
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock FontWeight="SemiBold" Text="{x:Bind Name}" />
|
||||
<TextBlock FontWeight="SemiBold" Text="{x:Bind DisplayName}" />
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
FontSize="13"
|
||||
|
||||
@@ -80,11 +80,11 @@ public class CalendarEventCollection
|
||||
// Multi-day events go to both.
|
||||
// Anything else goes to regular.
|
||||
|
||||
if (calendarItem.IsAllDayEvent)
|
||||
if (calendarItem.ItemType == Enums.CalendarItemType.AllDay || calendarItem.ItemType == Enums.CalendarItemType.MultiDayAllDay || calendarItem.ItemType == Enums.CalendarItemType.RecurringAllDay)
|
||||
{
|
||||
return [_internalAllDayEvents];
|
||||
}
|
||||
else if (calendarItem.IsMultiDayEvent)
|
||||
else if (calendarItem.ItemType == Enums.CalendarItemType.MultiDay || calendarItem.ItemType == Enums.CalendarItemType.MultiDayAllDay)
|
||||
{
|
||||
return [_internalRegularEvents, _internalAllDayEvents];
|
||||
}
|
||||
|
||||
@@ -8,8 +8,6 @@ public static class Constants
|
||||
public const string WinoLocalDraftHeader = "X-Wino-Draft-Id";
|
||||
public const string LocalDraftStartPrefix = "localDraft_";
|
||||
|
||||
public const string CalendarEventRecurrenceRuleSeperator = "___";
|
||||
|
||||
public const string ToastMailUniqueIdKey = nameof(ToastMailUniqueIdKey);
|
||||
public const string ToastActionKey = nameof(ToastActionKey);
|
||||
|
||||
|
||||
@@ -7,12 +7,40 @@ namespace Wino.Core.Domain.Entities.Calendar;
|
||||
public class AccountCalendar : IAccountCalendar
|
||||
{
|
||||
[PrimaryKey]
|
||||
public Guid Id { get; set; }
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
|
||||
[NotNull]
|
||||
public string RemoteCalendarId { get; set; } = string.Empty;
|
||||
|
||||
[NotNull]
|
||||
public Guid AccountId { get; set; }
|
||||
public string RemoteCalendarId { get; set; }
|
||||
public string SynchronizationDeltaToken { get; set; }
|
||||
public string Name { get; set; }
|
||||
public bool IsPrimary { get; set; }
|
||||
|
||||
[NotNull]
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
public string? Location { get; set; }
|
||||
|
||||
public string? TimeZone { get; set; }
|
||||
|
||||
public string? AccessRole { get; set; }
|
||||
|
||||
public bool IsPrimary { get; set; } = false;
|
||||
|
||||
public string? BackgroundColor { get; set; }
|
||||
|
||||
public string? ForegroundColor { get; set; }
|
||||
|
||||
public DateTime CreatedDate { get; set; }
|
||||
|
||||
public DateTime LastModified { get; set; }
|
||||
|
||||
public DateTime? LastSyncTime { get; set; }
|
||||
|
||||
public string? SynchronizationDeltaToken { get; set; }
|
||||
|
||||
public bool IsDeleted { get; set; } = false;
|
||||
public bool IsExtended { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
@@ -20,5 +48,4 @@ public class AccountCalendar : IAccountCalendar
|
||||
/// </summary>
|
||||
public string TextColorHex { get; set; }
|
||||
public string BackgroundColorHex { get; set; }
|
||||
public string TimeZone { get; set; }
|
||||
}
|
||||
|
||||
@@ -8,12 +8,29 @@ namespace Wino.Core.Domain.Entities.Calendar;
|
||||
public class CalendarEventAttendee
|
||||
{
|
||||
[PrimaryKey]
|
||||
public Guid Id { get; set; }
|
||||
public Guid CalendarItemId { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Email { get; set; }
|
||||
public AttendeeStatus AttendenceStatus { get; set; }
|
||||
public bool IsOrganizer { get; set; }
|
||||
public bool IsOptionalAttendee { get; set; }
|
||||
public string Comment { get; set; }
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
|
||||
[NotNull]
|
||||
public Guid EventId { get; set; }
|
||||
|
||||
[NotNull]
|
||||
public string Email { get; set; } = string.Empty;
|
||||
|
||||
public string? DisplayName { get; set; }
|
||||
|
||||
public AttendeeResponseStatus ResponseStatus { get; set; } = AttendeeResponseStatus.NeedsAction;
|
||||
|
||||
public bool IsOptional { get; set; } = false;
|
||||
|
||||
public bool IsOrganizer { get; set; } = false;
|
||||
|
||||
public bool IsSelf { get; set; } = false;
|
||||
|
||||
public string? Comment { get; set; }
|
||||
|
||||
public int? AdditionalGuests { get; set; }
|
||||
|
||||
public DateTime CreatedDate { get; set; }
|
||||
|
||||
public DateTime LastModified { get; set; }
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Diagnostics;
|
||||
using Itenso.TimePeriod;
|
||||
using SQLite;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Helpers;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
|
||||
namespace Wino.Core.Domain.Entities.Calendar;
|
||||
@@ -11,169 +12,81 @@ namespace Wino.Core.Domain.Entities.Calendar;
|
||||
public class CalendarItem : ICalendarItem
|
||||
{
|
||||
[PrimaryKey]
|
||||
public Guid Id { get; set; }
|
||||
public string RemoteEventId { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string Location { get; set; }
|
||||
public Guid Id { get; set; } = Guid.NewGuid();
|
||||
|
||||
public DateTime StartDate { get; set; }
|
||||
[NotNull]
|
||||
public string RemoteEventId { get; set; } = string.Empty;
|
||||
|
||||
public DateTime EndDate
|
||||
{
|
||||
get
|
||||
{
|
||||
return StartDate.AddSeconds(DurationInSeconds);
|
||||
}
|
||||
}
|
||||
[NotNull]
|
||||
public Guid CalendarId { get; set; }
|
||||
|
||||
public TimeSpan StartDateOffset { get; set; }
|
||||
public TimeSpan EndDateOffset { get; set; }
|
||||
[Ignore]
|
||||
public IAccountCalendar AssignedCalendar { get; set; }
|
||||
|
||||
[NotNull]
|
||||
public string Title { get; set; } = string.Empty;
|
||||
|
||||
public string? Description { get; set; }
|
||||
|
||||
public string? Location { get; set; }
|
||||
public string? HtmlLink { get; set; }
|
||||
|
||||
public DateTime StartDateTime { get; set; }
|
||||
|
||||
public DateTime EndDateTime { get; set; }
|
||||
|
||||
private ITimePeriod _period;
|
||||
public ITimePeriod Period
|
||||
{
|
||||
get
|
||||
{
|
||||
_period ??= new TimeRange(StartDate, EndDate);
|
||||
_period ??= new TimeRange(StartDateTime, EndDateTime);
|
||||
|
||||
return _period;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsAllDay { get; set; }
|
||||
|
||||
public string? TimeZone { get; set; }
|
||||
|
||||
public string? RecurrenceRules { get; set; }
|
||||
|
||||
public string? Status { get; set; }
|
||||
|
||||
public string? OrganizerDisplayName { get; set; }
|
||||
|
||||
public string? OrganizerEmail { get; set; }
|
||||
|
||||
public DateTime CreatedDate { get; set; }
|
||||
|
||||
public DateTime LastModified { get; set; }
|
||||
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
public string? RecurringEventId { get; set; }
|
||||
|
||||
public string? OriginalStartTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Events that starts at midnight and ends at midnight are considered all-day events.
|
||||
/// The type of calendar item (Timed, AllDay, MultiDay, etc.)
|
||||
/// </summary>
|
||||
public bool IsAllDayEvent
|
||||
public CalendarItemType ItemType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Automatically determines and sets the ItemType based on event properties
|
||||
/// </summary>
|
||||
public void DetermineItemType()
|
||||
{
|
||||
get
|
||||
{
|
||||
return
|
||||
StartDate.TimeOfDay == TimeSpan.Zero &&
|
||||
EndDate.TimeOfDay == TimeSpan.Zero;
|
||||
}
|
||||
}
|
||||
var hasRecurrence = !string.IsNullOrEmpty(RecurrenceRules);
|
||||
var isCancelled = Status?.ToLowerInvariant() == "cancelled" || IsDeleted;
|
||||
|
||||
/// <summary>
|
||||
/// Events that are either an exceptional instance of a recurring event or occurrences.
|
||||
/// IsOccurrence is used to display occurrence instances of parent recurring events.
|
||||
/// IsOccurrence == false && IsRecurringChild == true => exceptional single instance.
|
||||
/// </summary>
|
||||
public bool IsRecurringChild
|
||||
{
|
||||
get
|
||||
{
|
||||
return RecurringCalendarItemId != null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Events that are either an exceptional instance of a recurring event or occurrences.
|
||||
/// </summary>
|
||||
public bool IsRecurringEvent => IsRecurringChild || IsRecurringParent;
|
||||
|
||||
/// <summary>
|
||||
/// Events that are the master event definition of recurrence events.
|
||||
/// </summary>
|
||||
public bool IsRecurringParent
|
||||
{
|
||||
get
|
||||
{
|
||||
return !string.IsNullOrEmpty(Recurrence) && RecurringCalendarItemId == null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Events that are not all-day events and last more than one day are considered multi-day events.
|
||||
/// </summary>
|
||||
public bool IsMultiDayEvent
|
||||
{
|
||||
get
|
||||
{
|
||||
return Period.Duration.TotalDays >= 1 && !IsAllDayEvent;
|
||||
}
|
||||
}
|
||||
|
||||
public double DurationInSeconds { get; set; }
|
||||
public string Recurrence { get; set; }
|
||||
|
||||
public string OrganizerDisplayName { get; set; }
|
||||
public string OrganizerEmail { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The id of the parent calendar item of the recurring event.
|
||||
/// Exceptional instances are stored as a separate calendar item.
|
||||
/// This makes the calendar item a child of the recurring event.
|
||||
/// </summary>
|
||||
public Guid? RecurringCalendarItemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates read-only events. Default is false.
|
||||
/// </summary>
|
||||
public bool IsLocked { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Hidden events must not be displayed to the user.
|
||||
/// This usually happens when a child instance of recurring parent is cancelled after creation.
|
||||
/// </summary>
|
||||
public bool IsHidden { get; set; }
|
||||
|
||||
// TODO
|
||||
public string CustomEventColorHex { get; set; }
|
||||
public string HtmlLink { get; set; }
|
||||
public CalendarItemStatus Status { get; set; }
|
||||
public CalendarItemVisibility Visibility { get; set; }
|
||||
public DateTimeOffset CreatedAt { get; set; }
|
||||
public DateTimeOffset UpdatedAt { get; set; }
|
||||
public Guid CalendarId { get; set; }
|
||||
|
||||
[Ignore]
|
||||
public IAccountCalendar AssignedCalendar { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether this item does not really exist in the database or not.
|
||||
/// These are used to display occurrence instances of parent recurring events.
|
||||
/// </summary>
|
||||
[Ignore]
|
||||
public bool IsOccurrence { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Id to load information related to this event.
|
||||
/// Occurrences tracked by the parent recurring event if they are not exceptional instances.
|
||||
/// Recurring children here are exceptional instances. They have their own info in the database including Id.
|
||||
/// </summary>
|
||||
public Guid EventTrackingId => IsOccurrence ? RecurringCalendarItemId.Value : Id;
|
||||
|
||||
public CalendarItem CreateRecurrence(DateTime startDate, double durationInSeconds)
|
||||
{
|
||||
// Create a copy with the new start date and duration
|
||||
|
||||
return new CalendarItem
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
Title = Title,
|
||||
Description = Description,
|
||||
Location = Location,
|
||||
StartDate = startDate,
|
||||
DurationInSeconds = durationInSeconds,
|
||||
Recurrence = Recurrence,
|
||||
OrganizerDisplayName = OrganizerDisplayName,
|
||||
OrganizerEmail = OrganizerEmail,
|
||||
RecurringCalendarItemId = Id,
|
||||
AssignedCalendar = AssignedCalendar,
|
||||
CalendarId = CalendarId,
|
||||
CreatedAt = CreatedAt,
|
||||
UpdatedAt = UpdatedAt,
|
||||
Visibility = Visibility,
|
||||
Status = Status,
|
||||
CustomEventColorHex = CustomEventColorHex,
|
||||
HtmlLink = HtmlLink,
|
||||
StartDateOffset = StartDateOffset,
|
||||
EndDateOffset = EndDateOffset,
|
||||
RemoteEventId = RemoteEventId,
|
||||
IsHidden = IsHidden,
|
||||
IsLocked = IsLocked,
|
||||
IsOccurrence = true
|
||||
};
|
||||
ItemType = CalendarItemTypeHelper.DetermineItemType(
|
||||
StartDateTime,
|
||||
EndDateTime,
|
||||
IsAllDay,
|
||||
hasRecurrence,
|
||||
isCancelled,
|
||||
Status);
|
||||
}
|
||||
}
|
||||
|
||||
32
Wino.Core.Domain/Enums/AttendeeResponseStatus.cs
Normal file
32
Wino.Core.Domain/Enums/AttendeeResponseStatus.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Wino.Core.Domain.Enums;
|
||||
/// <summary>
|
||||
/// Represents the response status of an attendee to a calendar event
|
||||
/// </summary>
|
||||
public enum AttendeeResponseStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// The attendee has not responded to the invitation
|
||||
/// </summary>
|
||||
NeedsAction = 0,
|
||||
|
||||
/// <summary>
|
||||
/// The attendee has accepted the invitation
|
||||
/// </summary>
|
||||
Accepted = 1,
|
||||
|
||||
/// <summary>
|
||||
/// The attendee has declined the invitation
|
||||
/// </summary>
|
||||
Declined = 2,
|
||||
|
||||
/// <summary>
|
||||
/// The attendee has tentatively accepted the invitation
|
||||
/// </summary>
|
||||
Tentative = 3
|
||||
}
|
||||
49
Wino.Core.Domain/Enums/CalendarItemType.cs
Normal file
49
Wino.Core.Domain/Enums/CalendarItemType.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Wino.Core.Domain.Enums;
|
||||
public enum CalendarItemType
|
||||
{
|
||||
/// <summary>
|
||||
/// A standard timed event with specific start and end times on the same day
|
||||
/// </summary>
|
||||
Timed = 0,
|
||||
|
||||
/// <summary>
|
||||
/// An all-day event that spans exactly one day
|
||||
/// </summary>
|
||||
AllDay = 1,
|
||||
|
||||
/// <summary>
|
||||
/// A multi-day event that spans more than one day but has specific times
|
||||
/// </summary>
|
||||
MultiDay = 2,
|
||||
|
||||
/// <summary>
|
||||
/// A multi-day all-day event (e.g., vacation, conference spanning multiple days)
|
||||
/// </summary>
|
||||
MultiDayAllDay = 3,
|
||||
|
||||
/// <summary>
|
||||
/// A recurring event with a defined pattern (daily, weekly, monthly, yearly)
|
||||
/// </summary>
|
||||
Recurring = 4,
|
||||
|
||||
/// <summary>
|
||||
/// A recurring all-day event (e.g., annual holiday, weekly all-day event)
|
||||
/// </summary>
|
||||
RecurringAllDay = 5,
|
||||
|
||||
/// <summary>
|
||||
/// A single instance of a recurring event that has been modified
|
||||
/// </summary>
|
||||
RecurringException = 6,
|
||||
|
||||
/// <summary>
|
||||
/// An event that extends beyond midnight but is not multi-day (e.g., 11 PM to 2 AM)
|
||||
/// </summary>
|
||||
CrossMidnight = 7,
|
||||
}
|
||||
143
Wino.Core.Domain/Helpers/CalendarItemTypeHelper.cs
Normal file
143
Wino.Core.Domain/Helpers/CalendarItemTypeHelper.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Helpers;
|
||||
/// <summary>
|
||||
/// Helper class for CalendarItemType operations
|
||||
/// </summary>
|
||||
public static class CalendarItemTypeHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines the calendar item type based on event properties
|
||||
/// </summary>
|
||||
/// <param name="startDateTime">Event start date/time</param>
|
||||
/// <param name="endDateTime">Event end date/time</param>
|
||||
/// <param name="isAllDay">Whether the event is marked as all-day</param>
|
||||
/// <param name="isRecurring">Whether the event has recurrence rules</param>
|
||||
/// <param name="isCancelled">Whether the event is cancelled</param>
|
||||
/// <param name="status">Event status</param>
|
||||
/// <returns>The appropriate CalendarItemType</returns>
|
||||
public static CalendarItemType DetermineItemType(
|
||||
DateTime startDateTime,
|
||||
DateTime endDateTime,
|
||||
bool isAllDay,
|
||||
bool isRecurring = false,
|
||||
bool isCancelled = false,
|
||||
string? status = null)
|
||||
{
|
||||
// Handle recurring events
|
||||
if (isRecurring)
|
||||
{
|
||||
return isAllDay ? CalendarItemType.RecurringAllDay : CalendarItemType.Recurring;
|
||||
}
|
||||
|
||||
// Handle all-day events
|
||||
if (isAllDay)
|
||||
{
|
||||
var daySpan = (endDateTime.Date - startDateTime.Date).Days;
|
||||
return daySpan > 1 ? CalendarItemType.MultiDayAllDay : CalendarItemType.AllDay;
|
||||
}
|
||||
|
||||
// Handle timed events
|
||||
var duration = endDateTime - startDateTime;
|
||||
|
||||
|
||||
|
||||
// Multi-day timed events
|
||||
if (duration.TotalDays >= 1)
|
||||
{
|
||||
return CalendarItemType.MultiDay;
|
||||
}
|
||||
|
||||
// Cross midnight events (same calendar day but extends past midnight)
|
||||
if (startDateTime.Date != endDateTime.Date && duration.TotalHours <= 24)
|
||||
{
|
||||
return CalendarItemType.CrossMidnight;
|
||||
}
|
||||
|
||||
// Standard timed events
|
||||
return CalendarItemType.Timed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a human-readable description of the calendar item type
|
||||
/// </summary>
|
||||
/// <param name="itemType">The calendar item type</param>
|
||||
/// <returns>Description string</returns>
|
||||
public static string GetDescription(CalendarItemType itemType)
|
||||
{
|
||||
return itemType switch
|
||||
{
|
||||
CalendarItemType.Timed => "Timed Event",
|
||||
CalendarItemType.AllDay => "All-Day Event",
|
||||
CalendarItemType.MultiDay => "Multi-Day Event",
|
||||
CalendarItemType.MultiDayAllDay => "Multi-Day All-Day Event",
|
||||
CalendarItemType.Recurring => "Recurring Event",
|
||||
CalendarItemType.RecurringAllDay => "Recurring All-Day Event",
|
||||
CalendarItemType.RecurringException => "Modified Recurring Event",
|
||||
CalendarItemType.CrossMidnight => "Cross-Midnight Event",
|
||||
_ => "Unknown Event Type"
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the event type represents an all-day event
|
||||
/// </summary>
|
||||
/// <param name="itemType">The calendar item type</param>
|
||||
/// <returns>True if it's an all-day event type</returns>
|
||||
public static bool IsAllDayType(CalendarItemType itemType)
|
||||
{
|
||||
return itemType == CalendarItemType.AllDay ||
|
||||
itemType == CalendarItemType.MultiDayAllDay ||
|
||||
itemType == CalendarItemType.RecurringAllDay;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the event type represents a recurring event
|
||||
/// </summary>
|
||||
/// <param name="itemType">The calendar item type</param>
|
||||
/// <returns>True if it's a recurring event type</returns>
|
||||
public static bool IsRecurringType(CalendarItemType itemType)
|
||||
{
|
||||
return itemType == CalendarItemType.Recurring ||
|
||||
itemType == CalendarItemType.RecurringAllDay ||
|
||||
itemType == CalendarItemType.RecurringException;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the event type represents a multi-day event
|
||||
/// </summary>
|
||||
/// <param name="itemType">The calendar item type</param>
|
||||
/// <returns>True if it's a multi-day event type</returns>
|
||||
public static bool IsMultiDayType(CalendarItemType itemType)
|
||||
{
|
||||
return itemType == CalendarItemType.MultiDay ||
|
||||
itemType == CalendarItemType.MultiDayAllDay;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the priority level for sorting events (lower number = higher priority)
|
||||
/// </summary>
|
||||
/// <param name="itemType">The calendar item type</param>
|
||||
/// <returns>Priority number for sorting</returns>
|
||||
public static int GetSortPriority(CalendarItemType itemType)
|
||||
{
|
||||
return itemType switch
|
||||
{
|
||||
|
||||
CalendarItemType.AllDay => 2,
|
||||
CalendarItemType.MultiDayAllDay => 3,
|
||||
CalendarItemType.Timed => 4,
|
||||
CalendarItemType.CrossMidnight => 5,
|
||||
CalendarItemType.MultiDay => 6,
|
||||
CalendarItemType.Recurring => 7,
|
||||
CalendarItemType.RecurringAllDay => 8,
|
||||
CalendarItemType.RecurringException => 9,
|
||||
_ => 99
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -170,5 +170,4 @@ public interface IAccountService
|
||||
/// <param name="accountId">Account id.</param>
|
||||
/// <returns>Whether the notifications should be created after sync or not.</returns>
|
||||
Task<bool> IsNotificationsEnabled(Guid accountId);
|
||||
Task UpdateAccountCustomServerInformationAsync(CustomServerInformation customServerInformation);
|
||||
}
|
||||
|
||||
@@ -27,5 +27,5 @@ public interface IApplicationConfiguration
|
||||
/// <summary>
|
||||
/// Application insights instrumentation key.
|
||||
/// </summary>
|
||||
string SentryDNS { get; }
|
||||
string ApplicationInsightsInstrumentationKey { get; }
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using Itenso.TimePeriod;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Interfaces;
|
||||
|
||||
@@ -8,15 +9,8 @@ public interface ICalendarItem
|
||||
string Title { get; }
|
||||
Guid Id { get; }
|
||||
IAccountCalendar AssignedCalendar { get; }
|
||||
DateTime StartDate { get; set; }
|
||||
DateTime EndDate { get; }
|
||||
double DurationInSeconds { get; set; }
|
||||
DateTime StartDateTime { get; set; }
|
||||
DateTime EndDateTime { get; }
|
||||
ITimePeriod Period { get; }
|
||||
|
||||
bool IsAllDayEvent { get; }
|
||||
bool IsMultiDayEvent { get; }
|
||||
|
||||
bool IsRecurringChild { get; }
|
||||
bool IsRecurringParent { get; }
|
||||
bool IsRecurringEvent { get; }
|
||||
CalendarItemType ItemType { get; }
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
namespace Wino.Core.Domain.Interfaces;
|
||||
using System;
|
||||
|
||||
namespace Wino.Core.Domain.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Temporarily to enforce CalendarItemViewModel. Used in CalendarEventCollection.
|
||||
/// </summary>
|
||||
public interface ICalendarItemViewModel
|
||||
public interface ICalendarItemViewModel : ICalendarItem
|
||||
{
|
||||
bool IsSelected { get; set; }
|
||||
DateTime LocalStartDateTime { get; }
|
||||
DateTime LocalEndDateTime { get; }
|
||||
}
|
||||
|
||||
55
Wino.Core.Domain/Interfaces/ICalendarServiceEx.cs
Normal file
55
Wino.Core.Domain/Interfaces/ICalendarServiceEx.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Interfaces;
|
||||
public interface ICalendarServiceEx
|
||||
{
|
||||
Task<int> ClearAllCalendarEventAttendeesAsync();
|
||||
Task<int> ClearAllCalendarsAsync();
|
||||
Task<int> ClearAllDataAsync();
|
||||
Task<int> ClearAllEventsAsync();
|
||||
Task<int> DeleteCalendarAsync(string remoteCalendarId);
|
||||
Task<int> DeleteCalendarEventAttendeesForEventAsync(Guid eventId);
|
||||
Task<int> DeleteEventAsync(string remoteEventId);
|
||||
Task<List<CalendarEventAttendee>> GetAllCalendarEventAttendeesAsync();
|
||||
Task<List<AccountCalendar>> GetAllCalendarsAsync();
|
||||
Task<List<CalendarItem>> GetAllDayEventsAsync();
|
||||
Task<List<CalendarItem>> GetAllEventsAsync();
|
||||
Task<List<CalendarItem>> GetAllEventsIncludingDeletedAsync();
|
||||
Task<List<CalendarItem>> GetAllRecurringEventsByTypeAsync();
|
||||
Task<AccountCalendar> GetCalendarByRemoteIdAsync(string remoteCalendarId);
|
||||
Task<Dictionary<AttendeeResponseStatus, int>> GetCalendarEventAttendeeResponseCountsAsync(Guid eventId);
|
||||
Task<List<CalendarEventAttendee>> GetCalendarEventAttendeesForEventAsync(Guid eventId);
|
||||
Task<List<CalendarEventAttendee>> GetCalendarEventAttendeesForEventByRemoteIdAsync(string remoteEventId);
|
||||
Task<string> GetCalendarSyncTokenAsync(string calendarId);
|
||||
Task<CalendarItem> GetEventByRemoteIdAsync(string remoteEventId);
|
||||
Task<List<CalendarItem>> GetEventsByItemTypeAsync(CalendarItemType itemType);
|
||||
Task<List<CalendarItem>> GetEventsByItemTypesAsync(params CalendarItemType[] itemTypes);
|
||||
Task<List<CalendarItem>> GetEventsByremoteCalendarIdAsync(string remoteCalendarId);
|
||||
Task<List<CalendarItem>> GetEventsForCalendarAsync(Guid calendarId);
|
||||
Task<List<CalendarItem>> GetEventsInDateRangeAsync(DateTime startDate, DateTime endDate);
|
||||
Task<List<CalendarItem>> GetEventsSinceLastSyncAsync(DateTime? lastSyncTime);
|
||||
Task<Dictionary<CalendarItemType, int>> GetEventStatsByItemTypeAsync();
|
||||
Task<List<CalendarItem>> GetExpandedEventsInDateRangeAsync(DateTime startDate, DateTime endDate);
|
||||
Task<List<CalendarItem>> GetExpandedEventsInDateRangeWithExceptionsAsync(DateTime startDate, DateTime endDate, AccountCalendar calendar);
|
||||
Task<DateTime?> GetLastSyncTimeAsync(string calendarId);
|
||||
Task<List<CalendarItem>> GetMultiDayEventsAsync();
|
||||
Task<List<CalendarItem>> GetRecurringEventsAsync();
|
||||
Task<int> HardDeleteEventAsync(string remoteEventId);
|
||||
Task<int> InsertCalendarAsync(AccountCalendar calendar);
|
||||
Task<int> InsertCalendarEventAttendeeAsync(CalendarEventAttendee calendareventattendee);
|
||||
Task<int> InsertEventAsync(CalendarItem calendarItem);
|
||||
Task<int> MarkEventAsDeletedAsync(string remoteEventId, string remoteCalendarId);
|
||||
Task<int> SyncAttendeesForEventAsync(Guid eventId, List<CalendarEventAttendee> attendees);
|
||||
Task<int> SyncCalendarEventAttendeesForEventAsync(Guid eventId, List<CalendarEventAttendee> calendareventattendees);
|
||||
Task<int> UpdateAllEventItemTypesAsync();
|
||||
Task<int> UpdateCalendarAsync(AccountCalendar calendar);
|
||||
Task<int> UpdateCalendarEventAttendeeAsync(CalendarEventAttendee calendareventattendee);
|
||||
Task<int> UpdateCalendarSyncTokenAsync(string calendarId, string syncToken);
|
||||
Task<int> UpdateEventAsync(CalendarItem calendarItem);
|
||||
Task<int> UpsertCalendarAsync(AccountCalendar calendar);
|
||||
Task<int> UpsertEventAsync(CalendarItem calendarItem);
|
||||
}
|
||||
@@ -22,9 +22,4 @@ public interface INotificationBuilder
|
||||
/// Creates test notification for test purposes.
|
||||
/// </summary>
|
||||
Task CreateTestNotificationAsync(string title, string message);
|
||||
|
||||
/// <summary>
|
||||
/// Removes the toast notification for a specific mail by unique id.
|
||||
/// </summary>
|
||||
void RemoveNotification(Guid mailUniqueId);
|
||||
}
|
||||
|
||||
@@ -51,12 +51,6 @@ public interface IPreferencesService: INotifyPropertyChanged
|
||||
/// Local search will still offer online search at the end of local search results.
|
||||
/// </summary>
|
||||
SearchMode DefaultSearchMode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Setting: Interval in minutes for background email synchronization.
|
||||
/// </summary>
|
||||
int EmailSyncIntervalMinutes { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Mail
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Тип на акаунта",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Успешно",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Успешно валидиране",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Неуспешно валидиране на IMAP сървъра.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Този сървър изисква установяване на защитена SSL връзка, за да продължи. Моля, потвърдете данните за сертификата по-долу.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Разрешете защитената връзка, за да продължите да настройвате акаунта си.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Потребителска тема",
|
||||
"SettingsDeleteAccount_Description": "Изтриване на всички имейли и идентификационни данни, свързани с този акаунт.",
|
||||
"SettingsDeleteAccount_Title": "Изтриване на този акаунт",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Трябва ли Wino да ви пита за потвърждение всеки път, когато се опитвате да изтриете окончателно имейл с клавишите Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Защита от окончателно изтриване",
|
||||
"SettingsDiagnostics_Description": "За разработчици",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Споделете този идентификационен номер с разработчиците, когато ви помолят, за да получите помощ за проблемите, с които се сблъсквате в Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Показване визуализация на текста",
|
||||
"SettingsShowSenderPictures_Description": "Скриване/показване на миниатюрите на снимките на изпращача.",
|
||||
"SettingsShowSenderPictures_Title": "Показване на аватарите на подателите",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Добавяне на подпис",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Добавяне на персонализиран подпис",
|
||||
"SettingsSignature_DeleteSignature_Title": "Изтриване на подписа",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Групиране в разговори",
|
||||
"SettingsUnlinkAccounts_Description": "Премахване на връзката между акаунтите. Това няма да доведе до изтриване на акаунтите ви.",
|
||||
"SettingsUnlinkAccounts_Title": "Премахване на връзката между акаунтите",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Наистина ли искате да изтриете подписа „{0}“?",
|
||||
"SignatureDeleteDialog_Title": "Изтриване на подписа",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Име на вашия подпис",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino предлага 3 безплатни акаунта за начало. Ако имате нужда от повече от 3 акаунта, моля, надстройте",
|
||||
"WinoUpgradeMessage": "Надграждане до неограничен брой акаунти",
|
||||
"WinoUpgradeRemainingAccountsMessage": "Използвани са {0} от {1} безплатни акаунта.",
|
||||
"Yesterday": "Вчера",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Вчера"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Typ účtu",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Vlastní motiv",
|
||||
"SettingsDeleteAccount_Description": "Odstranit všechny e-maily a přihlašovací údaje spojené s tímto účtem.",
|
||||
"SettingsDeleteAccount_Title": "Smazat tento účet",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Měl by vás Wino požádat o potvrzení pokaždé, když se pokoušíte trvale smazat e-mail pomocí kláves Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Ochrana proti trvalému smazání",
|
||||
"SettingsDiagnostics_Description": "Pro vývojáře",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Zobrazit náhled textu",
|
||||
"SettingsShowSenderPictures_Description": "Skrýt/zobrazit náhled obrázku odesílatele.",
|
||||
"SettingsShowSenderPictures_Title": "Zobrazit avatary odesílatele",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Vlákna konverzací",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Rozpojit účty",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino nabízí 3 účty zdarma. Pokud potřebujete více než 3 účty, upgradujte prosím.",
|
||||
"WinoUpgradeMessage": "Přejít na neomezený počet účtů",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} z {1} použitých bezplatných účtů.",
|
||||
"Yesterday": "Včera",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Včera"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Kontotyp",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Erfolgreich",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validierung erfolgreich",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Erfolg",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP-Einstellungen erfolgreich gespeichert.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP-Server-Validierung fehlgeschlagen.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Dieser Server fordert einen SSL-Handshake an, um fortzufahren. Bitte bestätigen Sie die Details des Zertifikats unten.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Erlaube dem Handshake, die Einrichtung deines Kontos fortzusetzen.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Vorschautext anzeigen",
|
||||
"SettingsShowSenderPictures_Description": "Absender-Profilbilder ausblenden/anzeigen.",
|
||||
"SettingsShowSenderPictures_Title": "Absender-Profilbilder anzeigen",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Gravatar (falls verfügbar) als Absenderbild verwenden",
|
||||
"SettingsEnableFavicons_Title": "Domain-Icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Domain-Favicons (falls verfügbar) als Absenderbild verwenden",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Lösche Avatare im Cache",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Signatur hinzufügen",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Eigene Signatur hinzufügen",
|
||||
"SettingsSignature_DeleteSignature_Title": "Signatur löschen",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Unterhaltungsthreading",
|
||||
"SettingsUnlinkAccounts_Description": "Entfernen Sie den Link zwischen den Konten. Dies wird Ihre Konten nicht löschen.",
|
||||
"SettingsUnlinkAccounts_Title": "Konten trennen",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Aktions-Labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Zeige Aktions-Labels.",
|
||||
"SignatureDeleteDialog_Message": "Wollen Sie Signatur \"{0}\" wirklich löschen?",
|
||||
"SignatureDeleteDialog_Title": "Signatur löschen",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Fügen Sie Ihre Signatur ein",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino bietet 3 Accounts zum kostenlosen Start an. Wenn Sie mehr als 3 Accounts benötigen, upgraden Sie bitte.",
|
||||
"WinoUpgradeMessage": "Auf unbegrenzte Konten upgraden",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} von {1} kostenlosen Konten verwendet.",
|
||||
"Yesterday": "Gestern",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Intervall für E-Mail-Synchronisierung",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Intervall für die automatisches E-Mail-Synchronisierung (Minuten). Diese Einstellung wird erst nach einem Neustart von Wino Mail angewendet."
|
||||
"Yesterday": "Gestern"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Τύπος λογαριασμού",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Επιτυχία",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Επιτυχής επικύρωση",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Αποτυχία επικύρωσης διακομιστή IMAP.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Αυτός ο διακομιστής ζητά μια χειραψία SSL για να συνεχίσει. Παρακαλώ επιβεβαιώστε τις λεπτομέρειες του πιστοποιητικού παρακάτω.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Επιτρέψτε στην χειραψία να συνεχίσει τη ρύθμιση του λογαριασμού σας.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Προσαρμοσμένο Θέμα",
|
||||
"SettingsDeleteAccount_Description": "Διαγραφή όλων των e-mails και διαπιστευτηρίων που σχετίζονται με αυτόν τον λογαριασμό.",
|
||||
"SettingsDeleteAccount_Title": "Διαγραφή αυτού του λογαριασμού",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Πρέπει να Wino ζητήσει την επιβεβαίωση κάθε φορά που προσπαθείτε να διαγράψετε μόνιμα ένα μήνυμα χρησιμοποιώντας το Shift + Del;",
|
||||
"SettingsDeleteProtection_Title": "Προστασία Μόνιμης Διαγραφής",
|
||||
"SettingsDiagnostics_Description": "Για προγραμματιστές",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Μοιραστείτε αυτό το ID με τους προγραμματιστές όταν σας ζητηθεί να λάβετε βοήθεια για τα θέματα που αντιμετωπίζετε στο Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Εμφάνιση Κειμένου Προεπισκόπησης",
|
||||
"SettingsShowSenderPictures_Description": "Απόκρυψη/εμφάνιση της μικρογραφίας του αποστολέα.",
|
||||
"SettingsShowSenderPictures_Title": "Εμφάνιση Avatars Αποστολέα",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Προσθήκη υπογραφής",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Προσθήκη προσαρμοσμένης υπογραφής",
|
||||
"SettingsSignature_DeleteSignature_Title": "Διαγραφή υπογραφής",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Νηματοποίηση Συζήτησης",
|
||||
"SettingsUnlinkAccounts_Description": "Αφαιρέστε τη σύνδεση μεταξύ των λογαριασμών. Δε θα διαγράψει τους λογαριασμούς σας.",
|
||||
"SettingsUnlinkAccounts_Title": "Αποδέσμευση Λογαριασμών",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Σίγουρα θέλετε να διαγράψετε την υπογραφή \"{0}\";",
|
||||
"SignatureDeleteDialog_Title": "Διαγραφή υπογραφής",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Ονομάστε την υπογραφή σας",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Το Wino προσφέρει 3 λογαριασμούς για να ξεκινήσετε δωρεάν. Εάν χρειάζεστε περισσότερους από 3, παρακαλώ αναβαθμίστε",
|
||||
"WinoUpgradeMessage": "Αναβάθμιση σε Απεριόριστους Λογαριασμούς",
|
||||
"WinoUpgradeRemainingAccountsMessage": "Χρησιμοποιούνται {0} από τους {1} δωρεάν λογαριασμούς.",
|
||||
"Yesterday": "Χθες",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Χθες"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -698,9 +696,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Tipo de cuenta",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Correcto",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validación correcta",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Correcto",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "Ajustes IMAP guardados con éxito.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "La validación del servidor IMAP falló.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "El servidor requiere un protocolo de enlace SSL para continuar. Confirma los detalles del certificado a continuación.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Permite el protocolo de enlace para continuar configurando tu cuenta.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Mostrar texto de vista previa",
|
||||
"SettingsShowSenderPictures_Description": "Ocultar/mostrar imágenes del remitente en miniatura.",
|
||||
"SettingsShowSenderPictures_Title": "Mostrar Avatares de Remitente",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Usar gravatar (si está disponible) como imagen del remitente",
|
||||
"SettingsEnableFavicons_Title": "Iconos de dominio (Faviconos)",
|
||||
"SettingsEnableFavicons_Description": "Usar favicons de dominio (si está disponible) como imagen del remitente",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Limpiar avatares en caché",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Añadir firma",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Añadir firma personalizada",
|
||||
"SettingsSignature_DeleteSignature_Title": "Eliminar firma",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Hilos de conversación",
|
||||
"SettingsUnlinkAccounts_Description": "Eliminar el enlace entre cuentas. No eliminará sus cuentas.",
|
||||
"SettingsUnlinkAccounts_Title": "Desvincular Cuentas",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Etiquetas de acción",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Mostrar etiquetas de acción.",
|
||||
"SignatureDeleteDialog_Message": "¿Seguro que quieres eliminar la firma \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Eliminar firma",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Ponle un nombre a tu firma",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino ofrece 3 cuentas para empezar gratis. Si necesitas más de 3 cuentas por favor actualiza",
|
||||
"WinoUpgradeMessage": "Actualizar a Cuentas Ilimitadas",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} de {1} cuentas gratuitas usadas.",
|
||||
"Yesterday": "Ayer",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Ayer"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Type de compte",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Opération réussie",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation réussie",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Échec de la validation du serveur IMAP.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Ce serveur demande une liaison SSL pour continuer. Veuillez confirmer les détails du certificat ci-dessous.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Autorisez la négociation SSL à continuer à configurer votre compte.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Thème personnalisé",
|
||||
"SettingsDeleteAccount_Description": "Supprimer tous les e-mails et identifiants associés à ce compte.",
|
||||
"SettingsDeleteAccount_Title": "Supprimer ce compte",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Wino devrait-il vous demander une confirmation chaque fois que vous essayez de supprimer définitivement un mail en utilisant les touches Maj + Suppr ?",
|
||||
"SettingsDeleteProtection_Title": "Protection contre la suppression permanente",
|
||||
"SettingsDiagnostics_Description": "Pour les développeurs",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Partagez cet identifiant avec les développeurs lorsqu'ils vous aideront à résoudre les problèmes que vous rencontrez dans Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Afficher l'aperçu du texte",
|
||||
"SettingsShowSenderPictures_Description": "Masquer/afficher les vignettes des images de l'expéditeur.",
|
||||
"SettingsShowSenderPictures_Title": "Afficher l'avatar de l'expéditeur",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Ajouter une signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Ajouter une signature personnalisée",
|
||||
"SettingsSignature_DeleteSignature_Title": "Supprimer la signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Affichage en mode conversation",
|
||||
"SettingsUnlinkAccounts_Description": "Supprimer le lien entre les comptes. Cela ne supprimera pas vos comptes.",
|
||||
"SettingsUnlinkAccounts_Title": "Dissocier les comptes",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Êtes-vous sûr de vouloir supprimer la signature « {0} » ?",
|
||||
"SignatureDeleteDialog_Title": "Supprimer la signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Nom de la signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offre 3 comptes gratuits pour commencer. Si vous avez besoin de plus de 3 comptes, veuillez passer à la version supérieure",
|
||||
"WinoUpgradeMessage": "Mettre à niveau vers des comptes illimités",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} comptes gratuits utilisés sur {1}.",
|
||||
"Yesterday": "Hier",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Hier"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Tipo de conta",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Jenis akun",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Peladen ini meminta pertukaran SSL untuk melanjutkan. Mohon pastikan rincian sertifikat di bawah ini.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Izinkan pertukaran untuk melanjutkan mengatur akun Anda.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Tema Khusus",
|
||||
"SettingsDeleteAccount_Description": "Hapus semua surel dan informasi tentang akun ini.",
|
||||
"SettingsDeleteAccount_Title": "Hapus akun ini",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Haruskan Wino meminta persetujuan Anda setiap kali Anda menghapus permanen surel dengan tombol Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Perlindungan Hapus Permanen",
|
||||
"SettingsDiagnostics_Description": "Untuk pengembang",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Tampilkan Teks Pratinjau",
|
||||
"SettingsShowSenderPictures_Description": "Sembunyikan/tampilkan foto pengirim.",
|
||||
"SettingsShowSenderPictures_Title": "Tampilkan Foto Pengirim",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Tambah tanda tangan",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Tambahkan tanda tangan khusus",
|
||||
"SettingsSignature_DeleteSignature_Title": "Hapus tanda tangan",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Utas Percakapan",
|
||||
"SettingsUnlinkAccounts_Description": "Hapus tautan antara akun. Ini tidak akan menghapus akun Anda.",
|
||||
"SettingsUnlinkAccounts_Title": "Lepaskan Tautan Akun",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Apakah Anda yakin ingin menghapus tanda tangan \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Hapus tanda tangan",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Beri nama tanda tangan",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino menawarkan 3 akun secara gratis. Jika Anda membutuhkan lebih dari 3 akun, mohon tingkatkan.",
|
||||
"WinoUpgradeMessage": "Tingkatkan ke Akun Tak Terbatas",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} dari {1} akun gratis digunakan.",
|
||||
"Yesterday": "Kemarin",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Kemarin"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Tipo di account",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Riuscito",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Convalida riuscita",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Riuscito",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "Impostazioni IMAP salvate correttamente.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Convalida server IMAP non riuscita.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Questo server richiede un handshake SSL per continuare. Confermare i dettagli del certificato qui sotto.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Permetti all'handshake di continuare a configurare il tuo account.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Mostra testo di anteprima",
|
||||
"SettingsShowSenderPictures_Description": "Mostra/nascondi le miniature delle immagini del mittente.",
|
||||
"SettingsShowSenderPictures_Title": "Mostra avatar mittente",
|
||||
"SettingsEnableGravatarAvatars_Title": "Personificatore",
|
||||
"SettingsEnableGravatarAvatars_Description": "Usa il personificatore (se disponibile) come immagine del mittente",
|
||||
"SettingsEnableFavicons_Title": "Icone del dominio (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Usa le icone di dominio (se disponibili) come immagine del mittente",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Cancella personificatori nella cache",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Aggiungi firma",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Aggiungi firma personalizzata",
|
||||
"SettingsSignature_DeleteSignature_Title": "Elimina firma",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Raggruppamento conversazioni",
|
||||
"SettingsUnlinkAccounts_Description": "Rimuovi il collegamento tra gli account. Questo non eliminerà i tuoi account.",
|
||||
"SettingsUnlinkAccounts_Title": "Scollega account",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Etichette azioni",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Mostra le etichette delle azioni.",
|
||||
"SignatureDeleteDialog_Message": "Sei sicuro di voler eliminare la firma \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Elimina firma",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Nomina la tua firma",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offre 3 account per iniziare gratuitamente. Se hai bisogno di più di 3 account, per favore aggiorna",
|
||||
"WinoUpgradeMessage": "Aggiorna ad account illimitati",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} di {1} account gratuiti usati.",
|
||||
"Yesterday": "Ieri",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Intervallo sincronizzazione e-mail",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Intervallo di sincronizzazione automatica delle e-mail (minuti). Questa impostazione sarà applicata solo dopo il riavvio di Wino Mail."
|
||||
"Yesterday": "Ieri"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Account type",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Custom Theme",
|
||||
"SettingsDeleteAccount_Description": "Delete all e-mails and credentials associated with this account.",
|
||||
"SettingsDeleteAccount_Title": "Delete this account",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for comfirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Title": "Permanent Delete Protection",
|
||||
"SettingsDiagnostics_Description": "For developers",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,50 +1,50 @@
|
||||
{
|
||||
"AccountAlias_Column_Alias": "Alias",
|
||||
"AccountAlias_Column_IsPrimaryAlias": "Primair",
|
||||
"AccountAlias_Column_Verified": "Geverifieerd",
|
||||
"AccountAlias_Disclaimer_FirstLine": "Wino kan alleen aliassen voor uw Gmail accounts importeren.",
|
||||
"AccountAlias_Disclaimer_SecondLine": "Als u aliassen wilt gebruiken voor uw Outlook of IMAP-account, voeg deze dan zelf toe.",
|
||||
"AccountCacheReset_Title": "Account cache gereset",
|
||||
"AccountCacheReset_Message": "Dit account moet opnieuw gesynchroniseerd worden om te blijven werken. Wacht totdat Wino uw berichten opnieuw heeft gesynchroniseerd...",
|
||||
"AccountContactNameYou": "U",
|
||||
"AccountCreationDialog_Completed": "Alles is gereed",
|
||||
"AccountCreationDialog_FetchingEvents": "Agenda gebeurtenissen aan het ophalen.",
|
||||
"AccountCreationDialog_FetchingProfileInformation": "Profielgegevens aan het ophalen.",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row0": "Indien uw browser niet automatisch opstart om de authenticatie te voltooien:",
|
||||
"AccountAlias_Column_Verified": "Geverifiëerd",
|
||||
"AccountAlias_Disclaimer_FirstLine": "Wino can only import aliases for your Gmail accounts.",
|
||||
"AccountAlias_Disclaimer_SecondLine": "If you want to use aliases for your Outlook or IMAP account, please add them yourself.",
|
||||
"AccountCacheReset_Title": "Account Cache Reset",
|
||||
"AccountCacheReset_Message": "This account requires full re-sychronization to continue working. Please wait while Wino re-synchronizes your messages...",
|
||||
"AccountContactNameYou": "You",
|
||||
"AccountCreationDialog_Completed": "alles gedaan",
|
||||
"AccountCreationDialog_FetchingEvents": "Agenda gebeurtenissen ophalen.",
|
||||
"AccountCreationDialog_FetchingProfileInformation": "Profieldetails ophalen.",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row0": "Als uw browser niet automatisch opstart om de authenticatie te voltooien:",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row1": "1) Klik op de knop hieronder om het authenticatie-adres te kopiëren",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row2": "2) Start uw webbrowser op (Edge, Chrome, Firefox, etc.)",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row3": "3) Plak het gekopieerde adres en ga naar de website om de authenticatie handmatig te voltooien.",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row2": "2) Start uw webbrowser op (Edge, Chrome, Firefox enz...)",
|
||||
"AccountCreationDialog_GoogleAuthHelpClipboardText_Row3": "3) Plak het gekopieerde adres en ga naar de website om de authenticatie manueel te voltooien.",
|
||||
"AccountCreationDialog_Initializing": "Bezig met initialiseren",
|
||||
"AccountCreationDialog_PreparingFolders": "Map gegevens worden momenteel ontvangen.",
|
||||
"AccountCreationDialog_PreparingFolders": "Op dit moment krijgen we informatie over mappen.",
|
||||
"AccountCreationDialog_SigninIn": "Accountinformatie wordt opgeslagen.",
|
||||
"AccountEditDialog_Message": "Accountnaam",
|
||||
"AccountEditDialog_Title": "Account bewerken",
|
||||
"AccountEditDialog_Title": "Bewerk account",
|
||||
"AccountPickerDialog_Title": "Kies een account",
|
||||
"AccountSettingsDialog_AccountName": "Weergavenaam van afzender",
|
||||
"AccountSettingsDialog_AccountNamePlaceholder": "Bijv. Jan Smit",
|
||||
"AccountDetailsPage_Title": "Accountinformatie",
|
||||
"AccountDetailsPage_Description": "Wijzig de accountnaam in Wino en stel de gewenste naam van de afzender in.",
|
||||
"AccountDetailsPage_ColorPicker_Title": "Account kleur",
|
||||
"AccountDetailsPage_ColorPicker_Description": "Wijs een nieuwe account kleur toe om het bijbehorende symbool in de lijst in te kleuren.",
|
||||
"AccountSettingsDialog_AccountNamePlaceholder": "bijv. Jan Smit",
|
||||
"AccountDetailsPage_Title": "Account info",
|
||||
"AccountDetailsPage_Description": "Change the name of the account in Wino and set desired sender name.",
|
||||
"AccountDetailsPage_ColorPicker_Title": "Account color",
|
||||
"AccountDetailsPage_ColorPicker_Description": "Wijs een nieuwe account kleur toe om het bijbehorende symbool in de lijst te kleuren.",
|
||||
"AddHyperlink": "Toevoegen",
|
||||
"AppCloseBackgroundSynchronizationWarningTitle": "Achtergrondsynchronisatie",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageFirstLine": "Applicatie is niet ingesteld om te laden bij het opstarten van Windows.",
|
||||
"AppCloseBackgroundSynchronizationWarningTitle": "Achtergrond synchronisatie",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageFirstLine": "Applicatie is niet ingesteld om te starten bij het opstarten van Windows.",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageSecondLine": "Hierdoor mist u meldingen wanneer u uw computer herstart.",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageThirdLine": "Wilt u naar de instellingen gaan om het in te schakelen?",
|
||||
"AppCloseTerminateBehaviorWarningMessageFirstLine": "U beëindigt hiermee Wino Mail en het sluiten van uw app is ingesteld op 'Beëindigen'.",
|
||||
"AppCloseTerminateBehaviorWarningMessageSecondLine": "Dit zal alle achtergrondsynchronisaties en meldingen stoppen.",
|
||||
"AppCloseTerminateBehaviorWarningMessageThirdLine": "Wilt u naar de instellingen gaan om Wino Mail geminimaliseerd of op de achtergrond uit te voeren?",
|
||||
"AutoDiscoveryProgressMessage": "Bezig met zoeken naar mailinstellingen...",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageThirdLine": "Wilt u naar de instellingen gaan om het aan te zetten?",
|
||||
"AppCloseTerminateBehaviorWarningMessageFirstLine": "U beëindigt Wino-Mail en uw app sluit gedrag is ingesteld op 'Beëindig'.",
|
||||
"AppCloseTerminateBehaviorWarningMessageSecondLine": "Dit zal alle achtergrond synchronisatie en meldingen stoppen.",
|
||||
"AppCloseTerminateBehaviorWarningMessageThirdLine": "Wilt u naar de instellingen gaan om Wino-Mail uit te voeren naar geminimaliseerd of op de achtergrond?",
|
||||
"AutoDiscoveryProgressMessage": "Zoeken naar mailinstellingen...",
|
||||
"BasicIMAPSetupDialog_AdvancedConfiguration": "Geavanceerde configuratie",
|
||||
"BasicIMAPSetupDialog_CredentialLocalMessage": "Uw inloggegevens worden alleen lokaal op uw computer opgeslagen.",
|
||||
"BasicIMAPSetupDialog_CredentialLocalMessage": "Uw inloggegevens worden alleen lokaal opgeslagen op uw computer.",
|
||||
"BasicIMAPSetupDialog_Description": "Sommige accounts vereisen aanvullende stappen om in te loggen",
|
||||
"BasicIMAPSetupDialog_DisplayName": "Weergavenaam",
|
||||
"BasicIMAPSetupDialog_DisplayNamePlaceholder": "bijv. Jan Smit",
|
||||
"BasicIMAPSetupDialog_LearnMore": "Lees meer",
|
||||
"BasicIMAPSetupDialog_MailAddress": "E-mailadres",
|
||||
"BasicIMAPSetupDialog_MailAddressPlaceholder": "jansmit@voorbeeld.nl",
|
||||
"BasicIMAPSetupDialog_MailAddressPlaceholder": "fritsbarend@voorbeeld.nl",
|
||||
"BasicIMAPSetupDialog_Password": "Wachtwoord",
|
||||
"BasicIMAPSetupDialog_Title": "IMAP-account",
|
||||
"BasicIMAPSetupDialog_Title": "IMAP account",
|
||||
"Busy": "Bezig",
|
||||
"Buttons_AddAccount": "Account toevoegen",
|
||||
"Buttons_AddNewAlias": "Alias toevoegen",
|
||||
@@ -63,7 +63,7 @@
|
||||
"Buttons_EnableImageRendering": "Inschakelen",
|
||||
"Buttons_Multiselect": "Meerdere selecteren",
|
||||
"Buttons_No": "Nee",
|
||||
"Buttons_Open": "Openen",
|
||||
"Buttons_Open": "Open",
|
||||
"Buttons_Purchase": "Aanschaffen",
|
||||
"Buttons_RateWino": "Wino beoordelen",
|
||||
"Buttons_Reset": "Herstellen",
|
||||
@@ -76,16 +76,16 @@
|
||||
"Buttons_SyncAliases": "Aliassen synchroniseren",
|
||||
"Buttons_TryAgain": "Probeer opnieuw",
|
||||
"Buttons_Yes": "Ja",
|
||||
"CalendarAllDayEventSummary": "Gebeurtenissen die de hele dag duren",
|
||||
"CalendarDisplayOptions_Color": "Kleur",
|
||||
"CalendarDisplayOptions_Expand": "Uitklappen",
|
||||
"CalendarItem_DetailsPopup_JoinOnline": "Online aanmelden",
|
||||
"CalendarItem_DetailsPopup_ViewEventButton": "Gebeurtenis weergeven",
|
||||
"CalendarItem_DetailsPopup_ViewSeriesButton": "Series weergeven",
|
||||
"CalendarItemAllDay": "Gehele dag",
|
||||
"CalendarAllDayEventSummary": "gebeurtenissen die de hele dag duren",
|
||||
"CalendarDisplayOptions_Color": "Color",
|
||||
"CalendarDisplayOptions_Expand": "Expand",
|
||||
"CalendarItem_DetailsPopup_JoinOnline": "Join online",
|
||||
"CalendarItem_DetailsPopup_ViewEventButton": "View event",
|
||||
"CalendarItem_DetailsPopup_ViewSeriesButton": "View series",
|
||||
"CalendarItemAllDay": "de hele dag",
|
||||
"CategoriesFolderNameOverride": "Categorieën",
|
||||
"Center": "Centreren",
|
||||
"ClipboardTextCopied_Message": "{0} is naar het klembord gekopieerd.",
|
||||
"ClipboardTextCopied_Message": "{0} naar het klembord gekopieerd.",
|
||||
"ClipboardTextCopied_Title": "Gekopieerd",
|
||||
"ClipboardTextCopyFailed_Message": "Kopiëren van {0} naar het klembord mislukt.",
|
||||
"ComingSoon": "Binnenkort beschikbaar...",
|
||||
@@ -95,69 +95,69 @@
|
||||
"ComposerImagesDropZone_Message": "Sleep afbeeldingen hier naartoe",
|
||||
"ComposerSubject": "Onderwerp: ",
|
||||
"ComposerTo": "Aan: ",
|
||||
"ComposerToPlaceholder": "Tik op Enter om adressen in te voeren",
|
||||
"ComposerToPlaceholder": "klik op enter om adressen in te voeren",
|
||||
"CreateAccountAliasDialog_AliasAddress": "Adres",
|
||||
"CreateAccountAliasDialog_AliasAddressPlaceholder": "bijv. ondersteuning@mijndomein.nl",
|
||||
"CreateAccountAliasDialog_Description": "Verifieer dat uw uitgaande server het verzenden van e-mails vanaf deze alias toestaat.",
|
||||
"CreateAccountAliasDialog_AliasAddressPlaceholder": "bijv. ondersteuning@example.nl",
|
||||
"CreateAccountAliasDialog_Description": "Make sure your outgoing server allows sending mails from this alias.",
|
||||
"CreateAccountAliasDialog_ReplyToAddress": "Antwoordadres",
|
||||
"CreateAccountAliasDialog_ReplyToAddressPlaceholder": "admin@mijndomein.nl",
|
||||
"CreateAccountAliasDialog_ReplyToAddressPlaceholder": "admin@example.nl",
|
||||
"CreateAccountAliasDialog_Title": "Account alias aanmaken",
|
||||
"CustomThemeBuilder_AccentColorDescription": "Stel een aangepaste accentkleur in. Als u geen kleur selecteert dan zal de Windows accentkleur gebruikt worden.",
|
||||
"CustomThemeBuilder_AccentColorDescription": "Stel aan aangepaste accentkleur in. Maak geen keuze om de Windows-accentkleur te gebruiken.",
|
||||
"CustomThemeBuilder_AccentColorTitle": "Accentkleur",
|
||||
"CustomThemeBuilder_PickColor": "Kies",
|
||||
"CustomThemeBuilder_ThemeNameDescription": "Unieke naam voor uw aangepaste thema.",
|
||||
"CustomThemeBuilder_ThemeNameTitle": "Themanaam",
|
||||
"CustomThemeBuilder_Title": "Aangepaste Thema Maker",
|
||||
"CustomThemeBuilder_Title": "Aangepaste Thema Bouwer",
|
||||
"CustomThemeBuilder_WallpaperDescription": "Stel een eigen achtergrond in voor Wino",
|
||||
"CustomThemeBuilder_WallpaperTitle": "Aangepaste achtergrond instellen",
|
||||
"Dialog_DontAskAgain": "Niet opnieuw vragen",
|
||||
"DialogMessage_AccountLimitMessage": "U hebt de limiet bereikt voor het aanmaken van accounts.\nWilt u de 'Onbeperkte accounts' add-on aanschaffen om door te gaan?",
|
||||
"DialogMessage_AccountLimitTitle": "U heeft de limiet voor het aantal accounts bereikt",
|
||||
"DialogMessage_AliasCreatedMessage": "Nieuwe alias is succesvol aangemaakt.",
|
||||
"DialogMessage_AccountLimitMessage": "U hebt de limiet voor het aanmaken van accounts bereikt.\nWilt u de 'Onbeperkt aantal accounts' add-on kopen om door te gaan?",
|
||||
"DialogMessage_AccountLimitTitle": "Limiet accounts bereikt",
|
||||
"DialogMessage_AliasCreatedMessage": "Nieuw alias is succesvol aangemaakt.",
|
||||
"DialogMessage_AliasCreatedTitle": "Nieuw alias aangemaakt",
|
||||
"DialogMessage_AliasExistsMessage": "Deze alias is al in gebruik.",
|
||||
"DialogMessage_AliasExistsMessage": "Deze alias wordt al gebruikt.",
|
||||
"DialogMessage_AliasExistsTitle": "Bestaande alias",
|
||||
"DialogMessage_AliasNotSelectedMessage": "U moet een alias selecteren voordat u een bericht kunt verzenden.",
|
||||
"DialogMessage_AliasNotSelectedTitle": "Alias ontbreekt",
|
||||
"DialogMessage_CantDeleteRootAliasMessage": "Hoofd alias kan niet verwijderd worden. Dit is de hoofdidentiteit die gekoppeld is aan uw accountconfiguratie.",
|
||||
"DialogMessage_CantDeleteRootAliasMessage": "Hoofd alias kan niet verwijderd worden. Dit is de hoofdidentiteit die gekoppeld is aan uw account configuratie.",
|
||||
"DialogMessage_CantDeleteRootAliasTitle": "Kan alias niet verwijderen",
|
||||
"DialogMessage_CleanupFolderMessage": "Wilt u alle e-mails in deze map permanent verwijderen?",
|
||||
"DialogMessage_CleanupFolderTitle": "Map opschonen",
|
||||
"DialogMessage_ComposerMissingRecipientMessage": "Het bericht heeft geen ontvanger.",
|
||||
"DialogMessage_CleanupFolderTitle": "Opschonen map",
|
||||
"DialogMessage_ComposerMissingRecipientMessage": "Bericht heeft geen ontvanger.",
|
||||
"DialogMessage_ComposerValidationFailedTitle": "Validatie mislukt",
|
||||
"DialogMessage_CreateLinkedAccountMessage": "Geef deze koppeling een naam. Accounts worden samengevoegd onder deze naam.",
|
||||
"DialogMessage_CreateLinkedAccountTitle": "Naam van accountkoppeling",
|
||||
"DialogMessage_DeleteAccountConfirmationMessage": "{0} verwijderen?",
|
||||
"DialogMessage_CreateLinkedAccountTitle": "Naam van koppeling",
|
||||
"DialogMessage_DeleteAccountConfirmationMessage": "Verwijder {0}?",
|
||||
"DialogMessage_DeleteAccountConfirmationTitle": "Alle gegevens die gekoppeld zijn aan dit account worden permanent verwijderd.",
|
||||
"DialogMessage_DiscardDraftConfirmationMessage": "Dit concept zal worden verwijderd. Wilt u doorgaan?",
|
||||
"DialogMessage_DiscardDraftConfirmationTitle": "Concept verwijderen",
|
||||
"DialogMessage_EmptySubjectConfirmation": "Onderwerp ontbreekt",
|
||||
"DialogMessage_EmptySubjectConfirmationMessage": "Het bericht heeft geen onderwerp. Wilt u doorgaan?",
|
||||
"DialogMessage_EnableStartupLaunchDeniedMessage": "U kunt laden bij opstarten inschakelen via Instellingen -> App voorkeuren.",
|
||||
"DialogMessage_EnableStartupLaunchMessage": "Sta toe Wino Mail toe automatisch geminimaliseerd te laden bij het opstarten van Windows om geen meldingen te missen.\n\nWilt u laden bij het opstarten van Windows inschakelen?",
|
||||
"DialogMessage_EnableStartupLaunchTitle": "Laden bij opstarten inschakelen",
|
||||
"DialogMessage_EnableStartupLaunchDeniedMessage": "You can enable startup launch from Settings -> App Preferences.",
|
||||
"DialogMessage_EnableStartupLaunchMessage": "Let Wino Mail automatically launch minimized on Windows startup to not miss any notifications.\n\nDo you want to enable startup launch?",
|
||||
"DialogMessage_EnableStartupLaunchTitle": "Opstarten inschakelen",
|
||||
"DialogMessage_HardDeleteConfirmationMessage": "Permanent verwijderen",
|
||||
"DialogMessage_HardDeleteConfirmationTitle": "Bericht(en) zullen permanent verwijderd worden. Wilt u doorgaan?",
|
||||
"DialogMessage_InvalidAliasMessage": "Deze alias is ongeldig. Zorg ervoor dat alle e-mailadressen van de alias geldig zijn.",
|
||||
"DialogMessage_InvalidAliasMessage": "Deze alias is ongeldig. Zorg ervoor dat alle adressen van de alias geldige e-mailadressen zijn.",
|
||||
"DialogMessage_InvalidAliasTitle": "Ongeldige alias",
|
||||
"DialogMessage_NoAccountsForCreateMailMessage": "U heeft geen accounts om een bericht te maken.",
|
||||
"DialogMessage_NoAccountsForCreateMailMessage": "U heeft geen accounts om een bericht van te maken.",
|
||||
"DialogMessage_NoAccountsForCreateMailTitle": "Account ontbreekt",
|
||||
"DialogMessage_PrintingFailedMessage": "Afdrukken van deze e-mail mislukt. Resultaat: {0}",
|
||||
"DialogMessage_PrintingFailedTitle": "Mislukt",
|
||||
"DialogMessage_PrintingSuccessMessage": "E-mail wordt naar de printer verzonden.",
|
||||
"DialogMessage_PrintingSuccessTitle": "Voltooid",
|
||||
"DialogMessage_RenameFolderMessage": "Voer een nieuwe naam in voor deze map",
|
||||
"DialogMessage_PrintingSuccessTitle": "Gelukt",
|
||||
"DialogMessage_RenameFolderMessage": "Enter new name for this folder",
|
||||
"DialogMessage_RenameFolderTitle": "Map hernoemen",
|
||||
"DialogMessage_RenameLinkedAccountsMessage": "Voer een nieuwe naam in voor de gekoppelde account",
|
||||
"DialogMessage_RenameLinkedAccountsTitle": "Gekoppelde account hernoemen",
|
||||
"DialogMessage_UnlinkAccountsConfirmationMessage": "Deze handeling zal uw accounts niet verwijderen, maar zal alleen de koppeling voor gedeelde mappen verbreken. Wilt u doorgaan?",
|
||||
"DialogMessage_UnlinkAccountsConfirmationTitle": "Accounts ontkoppelen",
|
||||
"DialogMessage_RenameLinkedAccountsMessage": "Voer een nieuwe naam in voor gekoppeld account",
|
||||
"DialogMessage_RenameLinkedAccountsTitle": "Gekoppeld account hernoemen",
|
||||
"DialogMessage_UnlinkAccountsConfirmationMessage": "Deze handeling zal je accounts niet verwijderen, maar alleen de koppeling van gedeelde mappen verbreken. Wil je doorgaan?",
|
||||
"DialogMessage_UnlinkAccountsConfirmationTitle": "Ontkoppel accounts",
|
||||
"DialogMessage_UnsubscribeConfirmationGoToWebsiteConfirmButton": "Ga naar website",
|
||||
"DialogMessage_UnsubscribeConfirmationGoToWebsiteMessage": "Als u geen berichten meer wilt ontvangen van {0}, ga dan naar de betreffende website om u uit te schrijven.",
|
||||
"DialogMessage_UnsubscribeConfirmationMailtoMessage": "Wilt u geen berichten meer ontvangen van {0}? Wino zal u uitschrijven door een e-mail vanuit uw e-mailaccount te versturen naar {1}.",
|
||||
"DialogMessage_UnsubscribeConfirmationOneClickMessage": "Wilt u geen berichten meer ontvangen van {0}?",
|
||||
"DialogMessage_UnsubscribeConfirmationTitle": "Uitschrijven",
|
||||
"DiscordChannelDisclaimerMessage": "Wino heeft geen eigen Discord server, maar heeft een speciale 'wino-mail' kanaal dat gehost is op de 'Developer Sanctuary' server.\nAls u updates over Wino wilt ontvangen, meld u dan aan bij Developer Sanctuary en volg het 'wino-mail' kanaal onder \"Community Projects'.\n\nU wordt doorgestuurd naar de server-URL omdat Discord geen kanaaluitnodigingen ondersteunt.",
|
||||
"DialogMessage_UnsubscribeConfirmationGoToWebsiteMessage": "To stop getting messages from {0}, go to their website to unsubscribe.",
|
||||
"DialogMessage_UnsubscribeConfirmationMailtoMessage": "Do you want to stop getting messages from {0}? Wino will unsubscribe for you by sending an email from your email account to {1}.",
|
||||
"DialogMessage_UnsubscribeConfirmationOneClickMessage": "Do you want to stop getting messages from {0}?",
|
||||
"DialogMessage_UnsubscribeConfirmationTitle": "Afmelden",
|
||||
"DiscordChannelDisclaimerMessage": "Wino heeft geen eigen Discord server, maar het speciale 'wino-mail' kanaal is gehost op de 'Developer Sanctuary' server.\nOm updates over Wino te krijgen, sluit je je aan bij de Developer Sanctuary server en volg je 'wino-mail' kanaal onder 'Community Projects'\n\nJe wordt doorgestuurd naar de server-URL omdat Discord geen kanaaluitnodigingen ondersteunt.",
|
||||
"DiscordChannelDisclaimerTitle": "Belangrijke informatie over Discord",
|
||||
"Draft": "Concept",
|
||||
"DragMoveToFolderCaption": "Verplaatsen naar {0}",
|
||||
@@ -165,43 +165,43 @@
|
||||
"EditorToolbarOption_Format": "Opmaak",
|
||||
"EditorToolbarOption_Insert": "Invoegen",
|
||||
"EditorToolbarOption_None": "Geen",
|
||||
"EditorToolbarOption_Options": "Opties",
|
||||
"EditorToolbarOption_Options": "Instellingen",
|
||||
"EditorTooltip_WebViewEditor": "Gebruik web view editor",
|
||||
"ElementTheme_Dark": "Donkere modus",
|
||||
"ElementTheme_Default": "Systeeminstellingen gebruiken",
|
||||
"ElementTheme_Light": "Lichte modus",
|
||||
"Emoji": "Emoji",
|
||||
"Error_FailedToSetupSystemFolders_Title": "Instellen van systeemmappen mislukt",
|
||||
"Error_FailedToSetupSystemFolders_Title": "Failed to setup system folders",
|
||||
"Exception_AuthenticationCanceled": "Authenticatie geannuleerd",
|
||||
"Exception_CustomThemeExists": "Dit thema bestaat al.",
|
||||
"Exception_CustomThemeMissingName": "U moet een naam invullen.",
|
||||
"Exception_CustomThemeMissingWallpaper": "U moet een aangepaste achtergrondafbeelding invoeren.",
|
||||
"Exception_FailedToSynchronizeAliases": "Synchroniseren van aliassen mislukt",
|
||||
"Exception_FailedToSynchronizeAliases": "Failed to synchronize aliases",
|
||||
"Exception_FailedToSynchronizeFolders": "Synchroniseren van mappen mislukt",
|
||||
"Exception_FailedToSynchronizeProfileInformation": "Synchroniseren van profielinformatie mislukt",
|
||||
"Exception_FailedToSynchronizeProfileInformation": "Failed to synchronize profile information",
|
||||
"Exception_GoogleAuthCallbackNull": "Callback uri is null bij het activeren.",
|
||||
"Exception_GoogleAuthCorruptedCode": "Beschadigd autorisatie-antwoord.",
|
||||
"Exception_GoogleAuthCorruptedCode": "Beschadigd autorisatieantwoord.",
|
||||
"Exception_GoogleAuthError": "OAuth autorisatiefout: {0}",
|
||||
"Exception_GoogleAuthInvalidResponse": "Verzoek ontvangen met ongeldige status ({0})",
|
||||
"Exception_GoogleAuthorizationCodeExchangeFailed": "Uitwisselen van autorisatiecode mislukt.",
|
||||
"Exception_GoogleAuthorizationCodeExchangeFailed": "Uitwisselen van autorisatiecode is mislukt.",
|
||||
"Exception_ImapAutoDiscoveryFailed": "Instellingen mailbox niet gevonden.",
|
||||
"Exception_ImapClientPoolFailed": "IMAP Client Pool is mislukt.",
|
||||
"Exception_InboxNotAvailable": "Kan account mappen niet instellen.",
|
||||
"Exception_InvalidSystemFolderConfiguration": "De systeemmapconfiguratie is ongeldig. Controleer de configuratie en probeer het opnieuw.",
|
||||
"Exception_InvalidMultiAccountMoveTarget": "U kunt niet multipele items verplaatsen die behoren tot verschillende accounts in een gekoppeld account.",
|
||||
"Exception_MailProcessing": "Deze mail wordt nog verwerkt. Probeer het over enkele seconden opnieuw.",
|
||||
"Exception_MissingAlias": "Er bestaat geen primaire alias voor deze account. Concept aanmaken is mislukt.",
|
||||
"Exception_InvalidSystemFolderConfiguration": "De systeemmapconfiguratie is niet geldig. Controleer de configuratie en probeer het opnieuw.",
|
||||
"Exception_InvalidMultiAccountMoveTarget": "You can't move multiple items that belong to different accounts in linked account.",
|
||||
"Exception_MailProcessing": "This mail is still being processed. Please try again after few seconds.",
|
||||
"Exception_MissingAlias": "Primary alias does not exist for this account. Creating draft failed.",
|
||||
"Exception_NullAssignedAccount": "Toegewezen account is ongeldig",
|
||||
"Exception_NullAssignedFolder": "Toegewezen map is ongeldig",
|
||||
"Exception_SynchronizerFailureHTTP": "Antwoordverwerking mislukt met HTTP-foutcode {0}",
|
||||
"Exception_TokenGenerationFailed": "Genereren van token mislukt",
|
||||
"Exception_SynchronizerFailureHTTP": "Reactieverwerking mislukt met de HTTP-code {0}",
|
||||
"Exception_TokenGenerationFailed": "Token genereren mislukt",
|
||||
"Exception_TokenInfoRetrivalFailed": "Fout bij het ophalen van tokeninformatie.",
|
||||
"Exception_UnknowErrorDuringAuthentication": "Onbekende fout opgetreden tijdens authenticatie",
|
||||
"Exception_UnsupportedAction": "Actie {0} is niet geïmplementeerd in de aanvraagverwerker",
|
||||
"Exception_UnsupportedProvider": "Deze aanbieder wordt niet ondersteund.",
|
||||
"Exception_UnsupportedSynchronizerOperation": "Deze bewerking wordt niet ondersteund voor {0}",
|
||||
"Exception_UserCancelSystemFolderSetupDialog": "De gebruiker heeft het dialoogvenster voor het configureren van systeemmappen geannuleerd.",
|
||||
"Exception_WinoServerException": "Wino server mislukt",
|
||||
"Exception_UserCancelSystemFolderSetupDialog": "Gebruiker heeft het dialoogvenster configureren systeemmappen geannuleerd.",
|
||||
"Exception_WinoServerException": "Wino server mislukt.",
|
||||
"Files": "Bestanden",
|
||||
"FilteringOption_All": "Alle",
|
||||
"FilteringOption_Files": "Heeft bestanden",
|
||||
@@ -221,33 +221,33 @@
|
||||
"GeneralTitle_Error": "Fout",
|
||||
"GeneralTitle_Info": "Informatie",
|
||||
"GeneralTitle_Warning": "Waarschuwing",
|
||||
"GmailServiceDisabled_Title": "Gmail fout",
|
||||
"GmailServiceDisabled_Message": "Uw Google Workspace account is mogelijk uitgeschakeld voor Gmail service. Contacteer uw beheerder om Gmail service voor uw account in te schakelen.",
|
||||
"GmailArchiveFolderNameOverride": "Archief",
|
||||
"GmailServiceDisabled_Title": "Gmail Error",
|
||||
"GmailServiceDisabled_Message": "Your Google Workspace account seems to be disabled for Gmail service. Please contact your administrator to enable Gmail service for your account.",
|
||||
"GmailArchiveFolderNameOverride": "Archive",
|
||||
"HoverActionOption_Archive": "Archiveren",
|
||||
"HoverActionOption_Delete": "Verwijderen",
|
||||
"HoverActionOption_MoveJunk": "Verplaats naar Ongewenst",
|
||||
"HoverActionOption_ToggleFlag": "Markeren / Niet markeren",
|
||||
"HoverActionOption_ToggleFlag": "Vlag aan / uit",
|
||||
"HoverActionOption_ToggleRead": "Gelezen / Ongelezen",
|
||||
"ImageRenderingDisabled": "Afbeeldingsweergave is voor dit bericht uitgeschakeld.",
|
||||
"ImapAdvancedSetupDialog_AuthenticationMethod": "Authenticatiemethode",
|
||||
"ImapAdvancedSetupDialog_ConnectionSecurity": "Beveiliging van verbinding",
|
||||
"IMAPAdvancedSetupDialog_ValidationAuthMethodRequired": "Authenticatiemethode vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationConnectionSecurityRequired": "Type beveiliging van verbinding vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationDisplayNameRequired": "Weergavenaam vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationEmailInvalid": "Voer een geldig e-mailadres in",
|
||||
"IMAPAdvancedSetupDialog_ValidationEmailRequired": "E-mailadres vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationErrorTitle": "Controleer het volgende:",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingPortInvalid": "Inkomende poort moet liggen tussen 1-65535",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingPortRequired": "Inkomende poort is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingServerRequired": "Inkomende serveradres is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPasswordRequired": "Uitgaand serverwachtwoord is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPortInvalid": "Uitgaande poort moet liggen tussen 1-65535",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPortRequired": "Uitgaande serverpoort is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingServerRequired": "Uitgaand serveradres is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingUsernameRequired": "Gebruikersnaam van uitgaande server is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationPasswordRequired": "Wachtwoord is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationUsernameRequired": "Gebruikersnaam is vereist",
|
||||
"IMAPAdvancedSetupDialog_ValidationAuthMethodRequired": "Authentication method is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationConnectionSecurityRequired": "Connection security type is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationDisplayNameRequired": "Display name is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationEmailInvalid": "Please enter a valid email address",
|
||||
"IMAPAdvancedSetupDialog_ValidationEmailRequired": "Email address is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationErrorTitle": "Please check the following:",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingPortInvalid": "Incoming port must be between 1-65535",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingPortRequired": "Incoming server port is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationIncomingServerRequired": "Incoming server address is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPasswordRequired": "Outgoing server password is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPortInvalid": "Outgoing port must be between 1-65535",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingPortRequired": "Outgoing server port is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingServerRequired": "Outgoing server address is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationOutgoingUsernameRequired": "Outgoing server username is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationPasswordRequired": "Password is required",
|
||||
"IMAPAdvancedSetupDialog_ValidationUsernameRequired": "Username is required",
|
||||
"ImapAuthenticationMethod_Auto": "Automatisch",
|
||||
"ImapAuthenticationMethod_CramMD5": "CRAM-MD5",
|
||||
"ImapAuthenticationMethod_DigestMD5": "DIGEST-MD5",
|
||||
@@ -260,15 +260,13 @@
|
||||
"ImapConnectionSecurity_SslTls": "SSL/TLS",
|
||||
"ImapConnectionSecurity_StartTls": "STARTTLS",
|
||||
"IMAPSetupDialog_AccountType": "Accounttype",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Voltooid",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validatie voltooid",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Validatie van IMAP-server is mislukt.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Deze server vraagt naar een SSL-verificatie om door te kunnen gaan. Bevestig de certificaatdetails hieronder.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Verificatie toestaan om door te gaan met het instellen van uw account.",
|
||||
"IMAPSetupDialog_CertificateDenied": "Gebruiker heeft de verificatie met het certificaat niet geautoriseerd.",
|
||||
"IMAPSetupDialog_CertificateIssuer": "Uitgever",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
"IMAPSetupDialog_CertificateDenied": "User didn't authorize the handshake with the certificate.",
|
||||
"IMAPSetupDialog_CertificateIssuer": "Issuer",
|
||||
"IMAPSetupDialog_CertificateSubject": "Onderwerp",
|
||||
"IMAPSetupDialog_CertificateValidFrom": "Geldig van",
|
||||
"IMAPSetupDialog_CertificateValidTo": "Geldig tot",
|
||||
@@ -279,21 +277,21 @@
|
||||
"IMAPSetupDialog_DisplayNamePlaceholder": "bijv. Jan Smit",
|
||||
"IMAPSetupDialog_IncomingMailServer": "Inkomende (IMAP) e-mailserver",
|
||||
"IMAPSetupDialog_IncomingMailServerPort": "Poort",
|
||||
"IMAPSetupDialog_IMAPSettings": "IMAP-server instellingen",
|
||||
"IMAPSetupDialog_SMTPSettings": "SMTP-server instellingen",
|
||||
"IMAPSetupDialog_IMAPSettings": "IMAP Server Settings",
|
||||
"IMAPSetupDialog_SMTPSettings": "SMTP Server Settings",
|
||||
"IMAPSetupDialog_MailAddress": "E-mailadres",
|
||||
"IMAPSetupDialog_MailAddressPlaceholder": "iemand@voorbeeld.nl",
|
||||
"IMAPSetupDialog_OutgoingMailServer": "Uitgaande (SMTP) e-mailserver",
|
||||
"IMAPSetupDialog_OutgoingMailServerPassword": "Uitgaand server-wachtwoord",
|
||||
"IMAPSetupDialog_OutgoingMailServerPassword": "Uitgaande server-wachtwoord",
|
||||
"IMAPSetupDialog_OutgoingMailServerPort": "Poort",
|
||||
"IMAPSetupDialog_OutgoingMailServerRequireAuthentication": "Uitgaande server vereist authenticatie",
|
||||
"IMAPSetupDialog_OutgoingMailServerUsername": "Gebruikersnaam van uitgaande server",
|
||||
"IMAPSetupDialog_OutgoingMailServerUsername": "Uitgaande server gebruikersnaam",
|
||||
"IMAPSetupDialog_Password": "Wachtwoord",
|
||||
"IMAPSetupDialog_RequireSSLForIncomingMail": "SSL verplichten voor inkomende e-mail",
|
||||
"IMAPSetupDialog_RequireSSLForOutgoingMail": "SSL verplichten voor uitgaande e-mail",
|
||||
"IMAPSetupDialog_Title": "Geavanceerde IMAP Configuratie",
|
||||
"IMAPSetupDialog_Title": "Geavanceerde IMAP-instellingen",
|
||||
"IMAPSetupDialog_Username": "Gebruikersnaam",
|
||||
"IMAPSetupDialog_UsernamePlaceholder": "jansmit, jansmit@fabrikam.com, domein/jansmit",
|
||||
"IMAPSetupDialog_UsernamePlaceholder": "johndoe, johndoe@fabrikam.com, domein/johndoe",
|
||||
"IMAPSetupDialog_UseSameConfig": "Dezelfde gebruikersnaam en wachtwoord gebruiken voor het verzenden van e-mail",
|
||||
"Info_AccountCreatedMessage": "{0} is aangemaakt",
|
||||
"Info_AccountCreatedTitle": "Account aanmaken",
|
||||
@@ -302,48 +300,48 @@
|
||||
"Info_AccountDeletedTitle": "Account verwijderd",
|
||||
"Info_AccountIssueFixFailedTitle": "Mislukt",
|
||||
"Info_AccountIssueFixSuccessMessage": "Alle accountproblemen zijn opgelost.",
|
||||
"Info_AccountIssueFixSuccessTitle": "Gelukt",
|
||||
"Info_AccountIssueFixSuccessTitle": "Succesvol",
|
||||
"Info_AttachmentOpenFailedMessage": "Deze bijlage kan niet geopend worden.",
|
||||
"Info_AttachmentOpenFailedTitle": "Mislukt",
|
||||
"Info_AttachmentSaveFailedMessage": "Deze bijlage kan niet opgeslagen worden.",
|
||||
"Info_AttachmentSaveFailedTitle": "Mislukt",
|
||||
"Info_AttachmentSaveSuccessMessage": "Bijlage is opgeslagen.",
|
||||
"Info_AttachmentSaveSuccessTitle": "Bijlage opgeslagen",
|
||||
"Info_BackgroundExecutionDeniedMessage": "Uitvoering van de app op de achtergrond is geweigerd. Dit kan invloed hebben op synchronisatie op de achtergrond en live meldingen.",
|
||||
"Info_BackgroundExecutionDeniedTitle": "Uitvoering op achtergrond geweigerd",
|
||||
"Info_AttachmentSaveSuccessTitle": "Bijlage is opgeslagen",
|
||||
"Info_BackgroundExecutionDeniedMessage": "Uitvoering in de achtergrond voor de app is geweigerd. Dit kan invloed hebben op synchronisatie op de achtergrond en live meldingen.",
|
||||
"Info_BackgroundExecutionDeniedTitle": "Achtergronduitvoering geweigerd",
|
||||
"Info_BackgroundExecutionUnknownErrorMessage": "Onbekende fout opgetreden bij het registreren van achtergrondsynchronisatie.",
|
||||
"Info_BackgroundExecutionUnknownErrorTitle": "Fout bij uitvoeren op achtergrond",
|
||||
"Info_CantDeletePrimaryAliasMessage": "Primaire alias kan niet verwijderd worden. Wijzig eerst uw alias voordat u deze verwijdert.",
|
||||
"Info_ComposerMissingMIMEMessage": "Kan het MIME-bestand niet vinden. Synchroniseren kan dit oplossen.",
|
||||
"Info_BackgroundExecutionUnknownErrorTitle": "Fout bij uitvoeren in achtergrond",
|
||||
"Info_CantDeletePrimaryAliasMessage": "Primary alias can't be deleted. Please change your alias before deleting this one",
|
||||
"Info_ComposerMissingMIMEMessage": "Kan het MIME-bestand niet vinden. Synchroniseren kan helpen.",
|
||||
"Info_ComposerMissingMIMETitle": "Mislukt",
|
||||
"Info_ContactExistsMessage": "Dit contact staat al in de lijst met ontvangers.",
|
||||
"Info_ContactExistsMessage": "Dit contact staat al in het lijst met ontvangers.",
|
||||
"Info_ContactExistsTitle": "Contact bestaat",
|
||||
"Info_DraftFolderMissingMessage": "Conceptmap ontbreekt voor dit account. Controleer uw accountinstellingen.",
|
||||
"Info_DraftFolderMissingTitle": "Conceptmap ontbreekt",
|
||||
"Info_FailedToOpenFileMessage": "Bestand is mogelijk verwijderd.",
|
||||
"Info_FailedToOpenFileTitle": "Kan bestand niet openen.",
|
||||
"Info_FileLaunchFailedTitle": "Kan bestand niet openen",
|
||||
"Info_FailedToOpenFileMessage": "Mogelijks is het bestand verwijderd.",
|
||||
"Info_FailedToOpenFileTitle": "Kan bestand niet starten.",
|
||||
"Info_FileLaunchFailedTitle": "Kan bestand niet starten",
|
||||
"Info_InvalidAddressMessage": "{0} is geen geldig e-mailadres.",
|
||||
"Info_InvalidAddressTitle": "Ongeldig adres",
|
||||
"Info_InvalidMoveTargetMessage": "Geselecteerde e-mails kunnen niet verplaatst worden naar deze map.",
|
||||
"Info_InvalidMoveTargetTitle": "Ongeldig doel om te verplaatsen",
|
||||
"Info_InvalidMoveTargetTitle": "Invalid Move Target",
|
||||
"Info_LogsNotFoundMessage": "Er zijn geen logs om te delen.",
|
||||
"Info_LogsNotFoundTitle": "Logs niet gevonden",
|
||||
"Info_LogsSavedMessage": "{0} is opgeslagen in de geselecteerde map.",
|
||||
"Info_LogsSavedTitle": "Opgeslagen",
|
||||
"Info_MailListSizeResetSuccessMessage": "De grootte van de e-maillijst is hersteld.",
|
||||
"Info_MailListSizeResetSuccessMessage": "De grootte van de e-maillijst is gereset.",
|
||||
"Info_MailRenderingFailedMessage": "Deze e-mail is beschadigd of kan niet worden geopend.\n{0}",
|
||||
"Info_MailRenderingFailedTitle": "Weergave mislukt",
|
||||
"Info_MessageCorruptedMessage": "Dit bericht is beschadigd.",
|
||||
"Info_MessageCorruptedTitle": "Fout",
|
||||
"Info_MissingFolderMessage": "{0} bestaat niet voor dit account",
|
||||
"Info_MissingFolderMessage": "{0} doesn't exist for this account.",
|
||||
"Info_MissingFolderTitle": "Map ontbreekt",
|
||||
"Info_PDFSaveFailedTitle": "Kan Pdf-bestand niet opslaan",
|
||||
"Info_PDFSaveSuccessMessage": "PDF-bestand is opgeslagen in {0}",
|
||||
"Info_PDFSaveSuccessTitle": "Geslaagd",
|
||||
"Info_PDFSaveSuccessMessage": "Pdf-bestand is opgeslagen in {0}",
|
||||
"Info_PDFSaveSuccessTitle": "Gelukt",
|
||||
"Info_PurchaseExistsMessage": "Het lijkt erop dat dit product al eerder is gekocht.",
|
||||
"Info_PurchaseExistsTitle": "Bestaand product",
|
||||
"Info_PurchaseThankYouMessage": "Bedankt",
|
||||
"Info_PurchaseThankYouMessage": "Hartelijk bedankt!",
|
||||
"Info_PurchaseThankYouTitle": "Aankoop geslaagd",
|
||||
"Info_RequestCreationFailedTitle": "Aanvraag aanmaken is mislukt",
|
||||
"Info_ReviewNetworkErrorMessage": "Er was een netwerkprobleem met uw beoordeling.",
|
||||
@@ -360,9 +358,9 @@
|
||||
"Info_SyncCanceledMessage": "Geannuleerd",
|
||||
"Info_SyncCanceledTitle": "Synchronisatie",
|
||||
"Info_SyncFailedTitle": "Synchronisatie is mislukt",
|
||||
"Info_UnsubscribeErrorMessage": "Uitschrijven mislukt",
|
||||
"Info_UnsubscribeLinkInvalidMessage": "Deze uitschrijflink is ongeldig. Uitschrijven van de lijst is mislukt.",
|
||||
"Info_UnsubscribeLinkInvalidTitle": "Uitschrijf Uri is ongeldig",
|
||||
"Info_UnsubscribeErrorMessage": "Afmelden mislukt",
|
||||
"Info_UnsubscribeLinkInvalidMessage": "Deze afmeldlink is ongeldig. Afmelden van de lijst is mislukt.",
|
||||
"Info_UnsubscribeLinkInvalidTitle": "Ongeldige uitschrijf-URI",
|
||||
"Info_UnsubscribeSuccessMessage": "Succesvol uitgeschreven van {0}.",
|
||||
"Info_UnsupportedFunctionalityDescription": "Deze functionaliteit is nog niet geïmplementeerd.",
|
||||
"Info_UnsupportedFunctionalityTitle": "Niet ondersteund",
|
||||
@@ -372,11 +370,11 @@
|
||||
"Justify": "Uitvullen",
|
||||
"Left": "Links",
|
||||
"Link": "Link",
|
||||
"LinkedAccountsCreatePolicyMessage": "U moet tenminste 2 accounts hebben om een koppeling te maken.\nDe koppeling zal verwijderd worden bij het opslaan.",
|
||||
"LinkedAccountsCreatePolicyMessage": "Je moet ten minste 2 accounts hebben om een koppeling te maken.\nDe koppeling zal verwijderd worden bij het opslaan.",
|
||||
"LinkedAccountsTitle": "Gekoppelde accounts",
|
||||
"MailItemNoSubject": "Geen onderwerp",
|
||||
"MailOperation_AlwaysMoveFocused": "Altijd verplaatsen naar Prioriteit",
|
||||
"MailOperation_AlwaysMoveOther": "Altijd verplaatsen naar Overige",
|
||||
"MailOperation_AlwaysMoveOther": "Altijd verplaatsen naar andere",
|
||||
"MailOperation_Archive": "Archiveren",
|
||||
"MailOperation_ClearFlag": "Markering wissen",
|
||||
"MailOperation_DarkEditor": "Donker",
|
||||
@@ -394,20 +392,20 @@
|
||||
"MailOperation_MoveFocused": "Verplaatsen naar Prioriteit",
|
||||
"MailOperation_MoveJunk": "Verplaatsen naar Ongewenst",
|
||||
"MailOperation_MoveOther": "Verplaatsen naar Overige",
|
||||
"MailOperation_Navigate": "Navigeren",
|
||||
"MailOperation_Navigate": "Navigate",
|
||||
"MailOperation_Print": "Afdrukken",
|
||||
"MailOperation_Reply": "Beantwoorden",
|
||||
"MailOperation_ReplyAll": "Allen beantwoorden",
|
||||
"MailOperation_SaveAs": "Opslaan als",
|
||||
"MailOperation_SetFlag": "Vlag toevoegen",
|
||||
"MailOperation_Unarchive": "Niet meer archiveren",
|
||||
"MailOperation_Unarchive": "Unarchive",
|
||||
"MailOperation_ViewMessageSource": "Berichtbron weergeven",
|
||||
"MailOperation_Zoom": "Zoom",
|
||||
"MailsSelected": "{0} item(s) geselecteerd",
|
||||
"MarkFlagUnflag": "Vlag toevoegen/verwijderen",
|
||||
"MarkReadUnread": "Markeren als gelezen/ongelezen",
|
||||
"MenuManageAccounts": "Accounts beheren",
|
||||
"MenuMergedAccountItemAccountsSuffix": " Accounts",
|
||||
"MenuMergedAccountItemAccountsSuffix": " accounts",
|
||||
"MenuNewMail": "Nieuwe berichten",
|
||||
"MenuRate": "Wino-Mail beoordelen",
|
||||
"MenuSettings": "Instellingen",
|
||||
@@ -418,46 +416,46 @@
|
||||
"MergedAccountCommonFolderSent": "Verzonden",
|
||||
"MergedAccountCommonFolderTrash": "Verwijderd",
|
||||
"MergedAccountsAvailableAccountsTitle": "Beschikbare accounts",
|
||||
"MessageSourceDialog_Title": "Berichtbron",
|
||||
"MessageSourceDialog_Title": "Message source",
|
||||
"More": "Meer",
|
||||
"MoreFolderNameOverride": "Meer",
|
||||
"MoveMailDialog_InvalidFolderMessage": "{0} is geen geldige map voor deze e-mail.",
|
||||
"MoveMailDialog_Title": "Kies een map",
|
||||
"MoveMailDialog_Title": "Een map kiezen",
|
||||
"NewAccountDialog_AccountName": "Accountnaam",
|
||||
"NewAccountDialog_AccountNameDefaultValue": "Persoonlijk",
|
||||
"NewAccountDialog_AccountNamePlaceholder": "voorbeeld: Persoonlijke e-mail",
|
||||
"NewAccountDialog_AccountNamePlaceholder": "voorbeeld: Persoonlijke email",
|
||||
"NewAccountDialog_Title": "Nieuw account toevoegen",
|
||||
"NoMailSelected": "Geen berichten geselecteerd",
|
||||
"NoMessageCrieteria": "Er zijn geen berichten die voldoen aan u zoekcriteria",
|
||||
"NoMessageCrieteria": "No messages match your search criteria",
|
||||
"NoMessageEmptyFolder": "Deze map is leeg",
|
||||
"Notifications_MultipleNotificationsMessage": "U heeft {0} nieuwe berichten.",
|
||||
"Notifications_MultipleNotificationsTitle": "Nieuwe berichten",
|
||||
"Notifications_WinoUpdatedMessage": "Bekijk de nieuwe versie {0}",
|
||||
"Notifications_WinoUpdatedTitle": "Wino-Mail is bijgewerkt.",
|
||||
"OnlineSearchFailed_Message": "{0} zoeken is mislukt\n\nOffline e-mails worden weergegeven.",
|
||||
"OnlineSearchTry_Line1": "Kunt u niet vinden wat u zoekt?",
|
||||
"OnlineSearchTry_Line2": "Probeer online zoeken.",
|
||||
"OnlineSearchFailed_Message": "Failed to perform search\n{0}\n\nListing offline mails.",
|
||||
"OnlineSearchTry_Line1": "Can't find what you are looking for?",
|
||||
"OnlineSearchTry_Line2": "Try online search.",
|
||||
"Other": "Andere",
|
||||
"PaneLengthOption_Default": "Standaard",
|
||||
"PaneLengthOption_ExtraLarge": "Extra groot",
|
||||
"PaneLengthOption_ExtraLarge": "Extra lang",
|
||||
"PaneLengthOption_Large": "Groot",
|
||||
"PaneLengthOption_Medium": "Gemiddeld",
|
||||
"PaneLengthOption_Micro": "Micro",
|
||||
"PaneLengthOption_Small": "Klein",
|
||||
"Photos": "Foto’s",
|
||||
"PreparingFoldersMessage": "Mappen voorbereiden",
|
||||
"ProtocolLogAvailable_Message": "Protocol logs zijn beschikbaar voor diagnose.",
|
||||
"ProtocolLogAvailable_Message": "Protocol logs are available for diagnostics.",
|
||||
"ProviderDetail_Gmail_Description": "Google Account",
|
||||
"ProviderDetail_iCloud_Description": "Apple iCloud Account",
|
||||
"ProviderDetail_iCloud_Title": "iCloud",
|
||||
"ProviderDetail_IMAP_Description": "Aangepaste IMAP-/SMTP-server",
|
||||
"ProviderDetail_IMAP_Description": "Aangepaste IMAP/SMTP server",
|
||||
"ProviderDetail_IMAP_Title": "IMAP-server",
|
||||
"ProviderDetail_Yahoo_Description": "Yahoo Account",
|
||||
"ProviderDetail_Yahoo_Title": "Yahoo Mail",
|
||||
"QuickEventDialog_EventName": "Naam gebeurtenis",
|
||||
"QuickEventDialog_IsAllDay": "Gehele dag",
|
||||
"QuickEventDialog_EventName": "Event name",
|
||||
"QuickEventDialog_IsAllDay": "All day",
|
||||
"QuickEventDialog_Location": "Plaats",
|
||||
"QuickEventDialog_RemindMe": "Herinner mij",
|
||||
"QuickEventDialog_RemindMe": "Remind me",
|
||||
"QuickEventDialogMoreDetailsButtonText": "Meer details",
|
||||
"Reader_SaveAllAttachmentButtonText": "Alle bijlagen opslaan",
|
||||
"Results": "Resultaten",
|
||||
@@ -466,241 +464,232 @@
|
||||
"SearchingIn": "Zoeken in",
|
||||
"SearchPivotName": "Resultaten",
|
||||
"SettingConfigureSpecialFolders_Button": "Configureer",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Title": "IMAP/SMPT Configuratie",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Description": "Wijzig uw inkomende/uitgaande serverinstellingen.",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Title": "IMAP/SMTP Configuration",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Description": "Change your incoming/outgoing server settings.",
|
||||
"SettingsAbout_Description": "Meer informatie over Wino.",
|
||||
"SettingsAbout_Title": "Over",
|
||||
"SettingsAboutGithub_Description": "Ga naar de Issue Tracker in de GitHub-repository.",
|
||||
"SettingsAboutGithub_Title": "GitHub",
|
||||
"SettingsAboutVersion": "Versie",
|
||||
"SettingsAboutWinoDescription": "Lichtgewicht e-mailclient voor Windows-apparaten.",
|
||||
"SettingsAccentColor_Description": "Wijzig de accentkleur van de applicatie",
|
||||
"SettingsAboutVersion": "Versie ",
|
||||
"SettingsAboutWinoDescription": "Lichtgewicht e-mail client voor Windows-apparaten.",
|
||||
"SettingsAccentColor_Description": "Wijzig accentkleur van applicatie",
|
||||
"SettingsAccentColor_Title": "Accentkleur",
|
||||
"SettingsAccentColor_UseWindowsAccentColor": "Mijn Windows-accentkleur gebruiken",
|
||||
"SettingsAccountManagementAppendMessage_Description": "Maak een kopie van het bericht in de map Verzonden nadat het concept is verzonden. Schakel dit in als u uw e-mails niet in de map Verzonden ziet nadat u ze hebt verzonden.",
|
||||
"SettingsAccountManagementAppendMessage_Description": "Maak een kopie van het bericht in de map Verzonden nadat het concept is verzonden. Schakel dit in als u uw e-mails niet ziet nadat u ze hebt verzonden in de map 'Verzonden'.",
|
||||
"SettingsAccountManagementAppendMessage_Title": "Berichten toevoegen aan map Verzonden",
|
||||
"SettingsAccountName_Description": "Wijzig de accountnaam.",
|
||||
"SettingsAccountName_Description": "Verander de naam van het account.",
|
||||
"SettingsAccountName_Title": "Accountnaam",
|
||||
"SettingsApplicationTheme_Description": "Personaliseer Wino met aangepaste thema's naar uw voorkeur.",
|
||||
"SettingsApplicationTheme_Title": "Applicatie Thema",
|
||||
"SettingsAppPreferences_CloseBehavior_Description": "Wat moet er gebeuren als u de app sluit?",
|
||||
"SettingsAppPreferences_CloseBehavior_Title": "Sluitgedrag applicatie",
|
||||
"SettingsApplicationTheme_Description": "Personaliseer Wino met aangepaste thema's.",
|
||||
"SettingsApplicationTheme_Title": "Applicatie thema",
|
||||
"SettingsAppPreferences_CloseBehavior_Description": "Wat moet er gebeuren als je de app sluit?",
|
||||
"SettingsAppPreferences_CloseBehavior_Title": "Application close behavior",
|
||||
"SettingsAppPreferences_Description": "Algemene instellingen / voorkeuren voor Wino Mail.",
|
||||
"SettingsAppPreferences_SearchMode_Description": "Bepaal of Wino tijdens het zoeken de opgehaalde e-mails eerst moet controleren of uw online e-mailserver moet vragen. Lokaal zoeken is altijd sneller en u kunt altijd online zoeken als uw e-mail niet in de zoekresultaten staat.",
|
||||
"SettingsAppPreferences_SearchMode_Local": "Lokaal",
|
||||
"SettingsAppPreferences_SearchMode_Description": "Set whether Wino should check fetched mails first while doing a search or ask your mail server online. Local search is always faster and you can always do an online search if your mail is not in the results.",
|
||||
"SettingsAppPreferences_SearchMode_Local": "Local",
|
||||
"SettingsAppPreferences_SearchMode_Online": "Online",
|
||||
"SettingsAppPreferences_SearchMode_Title": "Standaard zoekmethode",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Invisible_Description": "Wino Mail zal op de achtergrond blijven draaien. U wordt op de hoogte gebracht wanneer er nieuwe e-mails binnenkomen.",
|
||||
"SettingsAppPreferences_SearchMode_Title": "Default search mode",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Invisible_Description": "Wino Mail zal in de achtergrond blijven draaien. U wordt op de hoogte gebracht wanneer er nieuwe berichten binnenkomen.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Invisible_Title": "Op de achtergrond uitvoeren",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Description": "Wino Mail zal in het systeemvak blijven draaien en laden als u op het icoon klikt. U wordt op de hoogte gebracht wanneer er nieuwe e-mails binnenkomen.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Title": "Minimaliseren naar het systeemvak",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Terminate_Description": "Wino Mail zal geheel niet uitgevoerd worden. U wordt niet op de hoogte gebracht wanneer nieuwe e-mails binnenkomen. Open Wino Mail opnieuw om e-mailsynchronisatie te continueren.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Description": "Wino Mail will keep running on the system tray. Available to launch by clicking on an icon. You will be notified as new mails arrive.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Title": "Minimaliseren naar systeembalk",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Terminate_Description": "Wino Mail will not keep running anywhere. You will not be notified as new mails arrive. Launch Wino Mail again to continue mail synchronization.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Terminate_Title": "Beëindigen",
|
||||
"SettingsAppPreferences_StartupBehavior_Description": "Wino Mail toestaan om geminimaliseerd te laden wanneer Windows opstart. Staat altijd toe om meldingen te ontvangen.",
|
||||
"SettingsAppPreferences_StartupBehavior_Description": "Allow Wino Mail to launch minimized when Windows starts. Always allow it to receive notifications.",
|
||||
"SettingsAppPreferences_StartupBehavior_Disable": "Uitschakelen",
|
||||
"SettingsAppPreferences_StartupBehavior_Disabled": "Wino Mail zal niet geladen worden wanneer Windows opstart. Hierdoor mist u meldingen wanneer u uw computer herstart.",
|
||||
"SettingsAppPreferences_StartupBehavior_DisabledByPolicy": "Uw beheerder of groepsbeleid heeft het laden van applicaties bij opstarten uitgeschakeld. Hierdoor kan Wino Mail niet laden bij het opstarten van Windows.",
|
||||
"SettingsAppPreferences_StartupBehavior_DisabledByUser": "Ga naar Taakbeheer ⇾ Tabblad Opstart-apps om Wino Mail toe te staan om te laden bij het opstarten van Windows.",
|
||||
"SettingsAppPreferences_StartupBehavior_Disabled": "Wino Mail will not be launched on Windows startup. This will cause you to miss notifications when you restart your computer.",
|
||||
"SettingsAppPreferences_StartupBehavior_DisabledByPolicy": "Your administrator or group policies disabled running applications on startup. Thus, Wino Mail can't be set to launch on Windows startup.",
|
||||
"SettingsAppPreferences_StartupBehavior_DisabledByUser": "Please go to Task Manager -> Startup tab to allow Wino Mail to launch on Windows startup.",
|
||||
"SettingsAppPreferences_StartupBehavior_Enable": "Inschakelen",
|
||||
"SettingsAppPreferences_StartupBehavior_Enabled": "Wino Mail is succesvol ingesteld om op de achtergrond te laden bij het opstarten van Windows.",
|
||||
"SettingsAppPreferences_StartupBehavior_FatalError": "Fatale fout tijdens het wijzigen van de opstartmethode voor Wino Mail.",
|
||||
"SettingsAppPreferences_StartupBehavior_Title": "Geminimaliseerd starten bij opstarten van Windows",
|
||||
"SettingsAppPreferences_StartupBehavior_Enabled": "Wino Mail successfully set to be launched in the background on Windows startup.",
|
||||
"SettingsAppPreferences_StartupBehavior_FatalError": "Fatal error occurred while changing the startup mode for Wino Mail.",
|
||||
"SettingsAppPreferences_StartupBehavior_Title": "Start geminimaliseerd bij opstarten van Windows",
|
||||
"SettingsAppPreferences_Title": "App voorkeuren",
|
||||
"SettingsAutoSelectNextItem_Description": "Selecteer het volgende item nadat u een e-mail hebt verwijderd of verplaatst.",
|
||||
"SettingsAutoSelectNextItem_Title": "Volgende item automatisch selecteren",
|
||||
"SettingsAutoSelectNextItem_Description": "Select the next item after you delete or move a mail.",
|
||||
"SettingsAutoSelectNextItem_Title": "Auto select next item",
|
||||
"SettingsAvailableThemes_Description": "Selecteer een thema uit Wino’s collectie of pas uw eigen thema's toe.",
|
||||
"SettingsAvailableThemes_Title": "Beschikbare thema's",
|
||||
"SettingsCalendarSettings_Description": "Wijzig de eerste weekdag, vakhoogte voor uren en meer...",
|
||||
"SettingsCalendarSettings_Title": "Agenda instellingen",
|
||||
"SettingsCalendarSettings_Description": "Change first day of week, hour cell height and more...",
|
||||
"SettingsCalendarSettings_Title": "Instellingen Agenda",
|
||||
"SettingsComposer_Title": "Opsteller",
|
||||
"SettingsComposerFont_Title": "Standaard lettertype voor opstellen",
|
||||
"SettingsComposerFontFamily_Description": "Wijzig de standaard lettertype en lettergrootte voor het opstellen van e-mails.",
|
||||
"SettingsConfigureSpecialFolders_Description": "Mappen met speciale functies instellen. Mappen zoals Archief, Inbox en Concepten zijn noodzakelijk om Wino goed te laten functioneren.",
|
||||
"SettingsConfigureSpecialFolders_Title": "Systeemmappen configureren",
|
||||
"SettingsComposerFont_Title": "Default Composer Font",
|
||||
"SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.",
|
||||
"SettingsConfigureSpecialFolders_Description": "Set folders with special functions. Folders such as Archive, Inbox, and Drafts are essential for Wino to function properly.",
|
||||
"SettingsConfigureSpecialFolders_Title": "Configure System Folders",
|
||||
"SettingsCustomTheme_Description": "Maak uw eigen aangepaste thema met aangepaste achtergrond en accentkleur.",
|
||||
"SettingsCustomTheme_Title": "Aangepaste thema",
|
||||
"SettingsDeleteAccount_Description": "Verwijder alle e-mails en gegevens die aan dit account zijn gekoppeld.",
|
||||
"SettingsCustomTheme_Title": "Aangepast Thema",
|
||||
"SettingsDeleteAccount_Description": "Verwijder alle e-mails en referenties die aan dit account zijn gekoppeld.",
|
||||
"SettingsDeleteAccount_Title": "Verwijder dit account",
|
||||
"SettingsDeleteProtection_Description": "Moet Wino u om bevestiging vragen elke keer wanneer u een e-mail permanent verwijdert met de Shift + Del toetsen?",
|
||||
"SettingsDeleteProtection_Title": "Bescherming tegen permanent verwijderen",
|
||||
"SettingsDeleteProtection_Description": "Moet Wino u om bevestiging vragen elke keer dat u een e-mail met Shift + Del verwijderd?",
|
||||
"SettingsDeleteProtection_Title": "Permanente verwijder-bescherming",
|
||||
"SettingsDiagnostics_Description": "Voor ontwikkelaars",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Deel dit ID met de ontwikkelaars wanneer er om hulp gevraagd wordt voor de problemen die u in Wino Mail ervaart.",
|
||||
"SettingsDiagnostics_DiagnosticId_Title": "Diagnostische ID",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
"SettingsDiagnostics_DiagnosticId_Title": "Diagnostic ID",
|
||||
"SettingsDiagnostics_Title": "Diagnose",
|
||||
"SettingsDiscord_Description": "Krijg regelmatig ontwikkelingsupdates, neem deel aan roadmap discussies en geef feedback.",
|
||||
"SettingsDiscord_Description": "Krijg regelmatige ontwikkelingsupdates, neem deel aan roadmap discussies en geef feedback.",
|
||||
"SettingsDiscord_Title": "Discord-kanaal",
|
||||
"SettingsEditLinkedInbox_Description": "Accounts toevoegen, verwijderen, hernoemen of de koppeling tussen accounts verbreken.",
|
||||
"SettingsEditLinkedInbox_Title": "Gekoppelde Inbox bewerken",
|
||||
"SettingsEditLinkedInbox_Description": "Accounts toevoegen, verwijderen, hernoemen of koppeling bewerken.",
|
||||
"SettingsEditLinkedInbox_Title": "Gekoppelde inbox bewerken",
|
||||
"SettingsElementTheme_Description": "Selecteer een Windows-thema voor Wino",
|
||||
"SettingsElementTheme_Title": "Thema modus",
|
||||
"SettingsElementThemeSelectionDisabled": "Thema modus selectie is uitgeschakeld wanneer een niet-standaard thema is geselecteerd.",
|
||||
"SettingsElementTheme_Title": "Element thema",
|
||||
"SettingsElementThemeSelectionDisabled": "Element themaselectie is uitgeschakeld wanneer een niet-standaard thema is geselecteerd.",
|
||||
"SettingsEnableHoverActions_Title": "Inschakelen van aanwijsacties",
|
||||
"SettingsEnableIMAPLogs_Description": "Schakel dit in om gegevens over problemen met de IMAP-verbinding te verstrekken die u tijdens de IMAP-server installatie hebt ervaren.",
|
||||
"SettingsEnableIMAPLogs_Description": "Schakel dit in om gegevens over IMAP-connectiviteit te verstrekken die je had tijdens de IMAP-server installatie.",
|
||||
"SettingsEnableIMAPLogs_Title": "IMAP Protocol Logs inschakelen",
|
||||
"SettingsEnableLogs_Description": "Mogelijk heb ik de logs nodig om uw problemen op GitHub te analyseren. Geen van de logs zal uw inloggegevens of gevoelige informatie bevatten.",
|
||||
"SettingsEnableLogs_Description": "Mogelijk heb ik de logs nodig om de door jou geopende problemen op GitHub te kunnen analyseren. Geen van de logs zal uw inloggegevens of gevoelige informatie bevatten.",
|
||||
"SettingsEnableLogs_Title": "Logs inschakelen",
|
||||
"SettingsEnableSignature": "Handtekening inschakelen",
|
||||
"SettingsExpandOnStartup_Description": "Bepaal of de mappen van dit account uitgeklapt moeten worden bij opstarten van Wino.",
|
||||
"SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.",
|
||||
"SettingsExpandOnStartup_Title": "Menu uitvouwen bij opstarten",
|
||||
"SettingsExternalContent_Description": "Beheer instellingen voor externe inhoud wanneer e-mails worden weergegeven.",
|
||||
"SettingsExternalContent_Title": "Externe inhoud",
|
||||
"SettingsFocusedInbox_Description": "Bepaal of Inbox verdeeld moet worden in Prioriteit - Overige",
|
||||
"SettingsExternalContent_Description": "Manage external content settings when rendering mails.",
|
||||
"SettingsExternalContent_Title": "External Content",
|
||||
"SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.",
|
||||
"SettingsFocusedInbox_Title": "Inbox Prioriteit",
|
||||
"SettingsFolderMenuStyle_Description": "Bepaal of accountmappen wel/niet binnen een accountmenu zitten. Schakel dit uit als u voorkeur hebt voor het oude systeemmenu van Windows Mail.",
|
||||
"SettingsFolderMenuStyle_Title": "Submappen aanmaken",
|
||||
"SettingsFolderOptions_Description": "Wijzig individuele mapinstellingen zoals het in- of uitschakelen van synchronisatie of weergeven/verbergen van de badge voor ongelezen e-mails.",
|
||||
"SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail",
|
||||
"SettingsFolderMenuStyle_Title": "Create Nested Folders",
|
||||
"SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.",
|
||||
"SettingsFolderOptions_Title": "Map configuratie",
|
||||
"SettingsFolderSync_Description": "In- of uitschakelen van het synchroniseren van specifieke mappen.",
|
||||
"SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.",
|
||||
"SettingsFolderSync_Title": "Map synchronisatie",
|
||||
"SettingsFontFamily_Title": "Lettertype",
|
||||
"SettingsFontPreview_Title": "Voorbeeld",
|
||||
"SettingsFontSize_Title": "Lettergrootte",
|
||||
"SettingsHoverActionCenter": "Middelste actie",
|
||||
"SettingsHoverActionLeft": "Linker actie",
|
||||
"SettingsHoverActionRight": "Rechter actie",
|
||||
"SettingsHoverActions_Description": "Selecteer 3 acties die verschijnen als u met de cursor de e-mails aanwijst.",
|
||||
"SettingsHoverActions_Title": "Aanwijsacties",
|
||||
"SettingsLanguage_Description": "Verander de weergavetaal voor Wino.",
|
||||
"SettingsHoverActionLeft": "Linkse actie",
|
||||
"SettingsHoverActionRight": "Rechtse actie",
|
||||
"SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.",
|
||||
"SettingsHoverActions_Title": "Hover Actions",
|
||||
"SettingsLanguage_Description": "Change display language for Wino.",
|
||||
"SettingsLanguage_Title": "Weergavetaal",
|
||||
"SettingsLanguageTime_Description": "Wino weergavetaal, voorkeur tijdnotatie",
|
||||
"SettingsLanguageTime_Description": "Wino display language, preferred time format.",
|
||||
"SettingsLanguageTime_Title": "Tijd en Taal",
|
||||
"SettingsLinkAccounts_Description": "Voeg meerdere account samen. Bekijk e-mails gezamenlijk vanuit één Inbox.",
|
||||
"SettingsLinkAccounts_Description": "Merge multiple accounts into one. See mails from one Inbox together.",
|
||||
"SettingsLinkAccounts_Title": "Gekoppelde accounts aanmaken",
|
||||
"SettingsLinkedAccountsSave_Description": "Pas de huidige koppeling met nieuwe accounts aan.",
|
||||
"SettingsLinkedAccountsSave_Description": "Modify the current link with the new accounts.",
|
||||
"SettingsLinkedAccountsSave_Title": "Wijzigingen opslaan",
|
||||
"SettingsLoadImages_Title": "Afbeeldingen automatisch laden",
|
||||
"SettingsLoadPlaintextLinks_Title": "Standaardtekst koppelingen omzetten naar klikbare koppelingen",
|
||||
"SettingsLoadPlaintextLinks_Title": "Convert plaintext links to clickable links",
|
||||
"SettingsLoadStyles_Title": "Stijlen automatisch laden",
|
||||
"SettingsMailListActionBar_Description": "Verberg/toon de actiebalk bovenaan de berichtenlijst.",
|
||||
"SettingsMailListActionBar_Title": "Toon e-maillijst acties",
|
||||
"SettingsMailSpacing_Description": "Pas de afstand aan voor het weergeven van berichten.",
|
||||
"SettingsMailSpacing_Title": "Mail afstand",
|
||||
"SettingsManageAccountSettings_Description": "Meldingen, handtekeningen, synchronisatie en andere instellingen per account.",
|
||||
"SettingsMailListActionBar_Description": "Aktionsleiste am oberen Rand der Nachrichtenliste aus-/einblenden.",
|
||||
"SettingsMailListActionBar_Title": "Toon e-mail actielijst",
|
||||
"SettingsMailSpacing_Description": "Adjust the spacing for listing mails.",
|
||||
"SettingsMailSpacing_Title": "Dichtheid",
|
||||
"SettingsManageAccountSettings_Description": "Notifications, signatures, synchronization and other settings per account.",
|
||||
"SettingsManageAccountSettings_Title": "Accountinstellingen beheren",
|
||||
"SettingsManageAliases_Description": "Bekijk, wijzig of verwijder e-mail aliassen die zijn toegewezen aan dit account.",
|
||||
"SettingsManageAliases_Description": "See e-mail aliases assigned for this account, update or delete them.",
|
||||
"SettingsManageAliases_Title": "Aliassen",
|
||||
"SettingsEditAccountDetails_Title": "Bewerk accountdetails",
|
||||
"SettingsEditAccountDetails_Description": "Wijzig accountnaam, naam van afzender en wijs een kleur toe indien gewenst.",
|
||||
"SettingsManageLink_Description": "Verplaats items naar een nieuwe koppeling of verwijder een bestaande koppeling.",
|
||||
"SettingsManageLink_Title": "Koppeling beheren",
|
||||
"SettingsMarkAsRead_Description": "Wijzig wat er met geselecteerde items moet gebeuren.",
|
||||
"SettingsMarkAsRead_DontChange": "Items niet automatisch als gelezen markeren",
|
||||
"SettingsMarkAsRead_SecondsToWait": "Aantal seconden om te wachten: ",
|
||||
"SettingsMarkAsRead_Timer": "Indien weergegeven in het leesvenster",
|
||||
"SettingsEditAccountDetails_Title": "Edit Account Details",
|
||||
"SettingsEditAccountDetails_Description": "Change account name, sender name and assign a new color if you like.",
|
||||
"SettingsManageLink_Description": "Move items to add new link or remove existing link.",
|
||||
"SettingsManageLink_Title": "Manage Link",
|
||||
"SettingsMarkAsRead_Description": "Change what should happen to the selected item.",
|
||||
"SettingsMarkAsRead_DontChange": "Don't automatically mark item as read",
|
||||
"SettingsMarkAsRead_SecondsToWait": "Aantal seconden wachten: ",
|
||||
"SettingsMarkAsRead_Timer": "When viewed in the reading pane",
|
||||
"SettingsMarkAsRead_Title": "Markeer bericht als gelezen",
|
||||
"SettingsMarkAsRead_WhenSelected": "Wanneer geselecteerd",
|
||||
"SettingsMessageList_Description": "Wijzig hoe uw berichten gerangschikt moeten worden in de e-maillijst.",
|
||||
"SettingsMessageList_Description": "Change how your messages should be organized in mail list.",
|
||||
"SettingsMessageList_Title": "Berichtenlijst",
|
||||
"SettingsNoAccountSetupMessage": "U heeft nog geen accounts ingesteld.",
|
||||
"SettingsNotifications_Description": "Meldingen voor dit account in- of uitschakelen.",
|
||||
"SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.",
|
||||
"SettingsNotifications_Description": "Turn on or off notifications for this account.",
|
||||
"SettingsNotifications_Title": "Meldingen",
|
||||
"SettingsNotificationsAndTaskbar_Description": "Bepaal of meldingen en de taakbalk badge weergegeven moeten worden voor dit account.",
|
||||
"SettingsNotificationsAndTaskbar_Title": "Meldingen en taakbalk",
|
||||
"SettingsNotificationsAndTaskbar_Description": "Change whether notifications should be displayed and taskbar badge for this account.",
|
||||
"SettingsNotificationsAndTaskbar_Title": "Notifications & Taskbar",
|
||||
"SettingsOptions_Title": "Instellingen",
|
||||
"SettingsPaneLengthReset_Description": "Reset de grootte van de e-maillijst naar de originele staat als u problemen hiermee ondervindt.",
|
||||
"SettingsPaneLengthReset_Title": "Grootte van e-maillijst herstellen",
|
||||
"SettingsPaypal_Description": "Toon veel meer liefde ❤️ Alle donaties worden gewaardeerd.",
|
||||
"SettingsPaneLengthReset_Description": "Reset the size of the mail list to original if you have issues with it.",
|
||||
"SettingsPaneLengthReset_Title": "Reset Mail List Size",
|
||||
"SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.",
|
||||
"SettingsPaypal_Title": "Doneren via PayPal",
|
||||
"SettingsPersonalization_Description": "Wijzig het uiterlijk van Wino naar uw voorkeur.",
|
||||
"SettingsPersonalization_Description": "Change appearance of Wino as you like.",
|
||||
"SettingsPersonalization_Title": "Personalisatie",
|
||||
"SettingsPersonalizationMailDisplayCompactMode": "Compacte modus",
|
||||
"SettingsPersonalizationMailDisplayMediumMode": "Gemiddelde modus",
|
||||
"SettingsPersonalizationMailDisplaySpaciousMode": "Uitgebreide modus",
|
||||
"SettingsPrefer24HourClock_Description": "Tijdstempels van ontvangen e-mails worden in 24-uursnotatie weergegeven in plaats van 12-uursnotatie (AM/PM)",
|
||||
"SettingsPrefer24HourClock_Title": "Tijd in 24-uursnotatie weergeven",
|
||||
"SettingsPrivacyPolicy_Description": "Privacybeleid bekijken",
|
||||
"SettingsPersonalizationMailDisplayMediumMode": "Gezellige modus",
|
||||
"SettingsPersonalizationMailDisplaySpaciousMode": "Ruime modus",
|
||||
"SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)",
|
||||
"SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours",
|
||||
"SettingsPrivacyPolicy_Description": "Review privacy policy.",
|
||||
"SettingsPrivacyPolicy_Title": "Privacybeleid",
|
||||
"SettingsReadComposePane_Description": "Lettertypen, externe inhoud.",
|
||||
"SettingsReadComposePane_Title": "Lezer & Opsteller",
|
||||
"SettingsReader_Title": "Lezer",
|
||||
"SettingsReaderFont_Title": "Standaard Lezer lettertype",
|
||||
"SettingsReaderFontFamily_Description": "Wijzig de standaard lettertype en lettergrootte voor het lezen van e-mails.",
|
||||
"SettingsRenameMergeAccount_Description": "Verander de weergavenaam van gekoppelde accounts.",
|
||||
"SettingsReaderFont_Title": "Standaard lezer lettertype",
|
||||
"SettingsReaderFontFamily_Description": "Wijzig de standaard lettertype en lettergrootte voor het lezen van berichten.",
|
||||
"SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.",
|
||||
"SettingsRenameMergeAccount_Title": "Naam wijzigen",
|
||||
"SettingsReorderAccounts_Description": "Verander de volgorde van accounts in de accountlijst.",
|
||||
"SettingsReorderAccounts_Title": "Accounts herangschikken",
|
||||
"SettingsSemanticZoom_Description": "Hiermee kunt u op koppen in de berichtenlijst klikken en naar een specifieke datum springen",
|
||||
"SettingsSemanticZoom_Title": "Semantische zoom voor datumkoppen",
|
||||
"SettingsShowPreviewText_Description": "Verberg/toon voorbeeldtekst.",
|
||||
"SettingsShowPreviewText_Title": "Voorbeeldtekst weergeven",
|
||||
"SettingsShowSenderPictures_Description": "Verberg/toon miniatuurafbeeldingen van afzender.",
|
||||
"SettingsShowSenderPictures_Title": "Avatars van afzenders tonen",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Gebruik gravatar als foto voor afzender (indien beschikbaar)",
|
||||
"SettingsEnableFavicons_Title": "Domein iconen (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Gebruik domein favicons als foto voor afzender (indien beschikbaar)",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Cache van avatars legen",
|
||||
"SettingsReorderAccounts_Description": "Change the order of accounts in the account list.",
|
||||
"SettingsReorderAccounts_Title": "Accounts opnieuw indelen",
|
||||
"SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date",
|
||||
"SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers",
|
||||
"SettingsShowPreviewText_Description": "Hide/show the preview text.",
|
||||
"SettingsShowPreviewText_Title": "Voorbeeld tekst weergeven",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Handtekening toevoegen",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Aangepaste handtekening toevoegen",
|
||||
"SettingsSignature_DeleteSignature_Title": "Handtekening verwijderen",
|
||||
"SettingsSignature_Description": "Accounthandtekeningen beheren",
|
||||
"SettingsSignature_Description": "Manage account signatures",
|
||||
"SettingsSignature_EditSignature_Title": "Handtekening aanpassen",
|
||||
"SettingsSignature_ForFollowingMessages_Title": "Voor antwoorden/doorsturingen",
|
||||
"SettingsSignature_ForNewMessages_Title": "Voor nieuwe berichten",
|
||||
"SettingsSignature_ForFollowingMessages_Title": "For Replies/Forwards",
|
||||
"SettingsSignature_ForNewMessages_Title": "For New Messages",
|
||||
"SettingsSignature_NoneSignatureName": "Geen",
|
||||
"SettingsSignature_SignatureDefaults": "Standaard handtekeningen",
|
||||
"SettingsSignature_SignatureDefaults": "Signature defaults",
|
||||
"SettingsSignature_Signatures": "Handtekeningen",
|
||||
"SettingsSignature_Title": "Handtekening",
|
||||
"SettingsStartupItem_Description": "Te openen Inbox van primaire account bij opstarten.",
|
||||
"SettingsStartupItem_Title": "Opstart account",
|
||||
"SettingsStartupItem_Description": "Primary account item to load Inbox at startup.",
|
||||
"SettingsStartupItem_Title": "Startup Item",
|
||||
"SettingsStore_Description": "Toon wat liefde ❤️",
|
||||
"SettingsStore_Title": "Beoordeel in Store",
|
||||
"SettingsTaskbarBadge_Description": "Includeer aantal ongelezen e-mails in taakbalkpictogram.",
|
||||
"SettingsStore_Title": "Rate in Store",
|
||||
"SettingsTaskbarBadge_Description": "Include unread mail count in taskbar icon.",
|
||||
"SettingsTaskbarBadge_Title": "Taakbalk badge",
|
||||
"SettingsThreads_Description": "Voeg berichten samen tot gesprekken.",
|
||||
"SettingsThreads_Title": "Gesprekken",
|
||||
"SettingsUnlinkAccounts_Description": "Verwijder de koppeling tussen accounts. Dit zal niet uw accounts verwijderen.",
|
||||
"SettingsUnlinkAccounts_Title": "Ontkoppel accounts",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Actielabels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Actielabels weergeven.",
|
||||
"SignatureDeleteDialog_Message": "Weet u zeker dat u \"{0}\" handtekening wilt verwijderen?",
|
||||
"SettingsThreads_Description": "Organize messages into conversation threads.",
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Verwijder handtekening",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Noem uw handtekening",
|
||||
"SignatureEditorDialog_SignatureName_TitleEdit": "Huidige naam handtekening: {0}",
|
||||
"SignatureEditorDialog_SignatureName_TitleNew": "Naam handtekening",
|
||||
"SignatureEditorDialog_Title": "Handtekening bewerker",
|
||||
"SortingOption_Date": "Op datum",
|
||||
"SortingOption_Name": "Op naam",
|
||||
"StoreRatingDialog_MessageFirstLine": "Alle feedback wordt gewaardeerd en zal Wino in de toekomst verbeteren. Wilt u Wino beoordelen in de Microsoft Store?",
|
||||
"StoreRatingDialog_MessageSecondLine": "Wilt u Wino Mail beoordelen in de Microsoft Store?",
|
||||
"StoreRatingDialog_Title": "Bent u tevreden over Wino?",
|
||||
"SignatureEditorDialog_SignatureName_TitleEdit": "Current signature name: {0}",
|
||||
"SignatureEditorDialog_SignatureName_TitleNew": "Handtekening naam",
|
||||
"SignatureEditorDialog_Title": "Signature Editor",
|
||||
"SortingOption_Date": "door datum",
|
||||
"SortingOption_Name": "door naam",
|
||||
"StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?",
|
||||
"StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?",
|
||||
"StoreRatingDialog_Title": "Vind je Wino leuk?",
|
||||
"SynchronizationFolderReport_Failed": "Synchronisatie is mislukt",
|
||||
"SynchronizationFolderReport_Success": "Bijgewerkt",
|
||||
"SystemFolderConfigDialog_ArchiveFolderDescription": "Gearchiveerde berichten zullen hier worden verplaatst.",
|
||||
"SystemFolderConfigDialog_ArchiveFolderHeader": "Map Archief",
|
||||
"SystemFolderConfigDialog_DeletedFolderDescription": "Verwijderde berichten zullen hier worden verplaatst",
|
||||
"SystemFolderConfigDialog_DeletedFolderHeader": "Map Verwijderd",
|
||||
"SystemFolderConfigDialog_DraftFolderDescription": "Nieuwe e-mails/antwoorden zullen hier worden aangemaakt.",
|
||||
"SystemFolderConfigDialog_DraftFolderHeader": "Map Concepten",
|
||||
"SystemFolderConfigDialog_JunkFolderDescription": "Alle ongewenste e-mails zullen hier zijn.",
|
||||
"SystemFolderConfigDialog_JunkFolderHeader": "Map Ongewenst",
|
||||
"SystemFolderConfigDialog_MessageFirstLine": "Deze IMAP-server ondersteunt geen SPECIAL-USE extensie en Wino kan hierdoor de systeemmappen niet correct instellen.",
|
||||
"SystemFolderConfigDialog_MessageSecondLine": "Selecteert de juiste mappen voor specifieke functionaliteiten.",
|
||||
"SystemFolderConfigDialog_SentFolderDescription": "Map waarin verzonden berichten worden opgeslagen.",
|
||||
"SystemFolderConfigDialog_SentFolderHeader": "Map Verzonden",
|
||||
"SynchronizationFolderReport_Success": "Up-to-date",
|
||||
"SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.",
|
||||
"SystemFolderConfigDialog_ArchiveFolderHeader": "Archief map",
|
||||
"SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.",
|
||||
"SystemFolderConfigDialog_DeletedFolderHeader": "Verwijderde map",
|
||||
"SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.",
|
||||
"SystemFolderConfigDialog_DraftFolderHeader": "Concepten map",
|
||||
"SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.",
|
||||
"SystemFolderConfigDialog_JunkFolderHeader": "Ongewenste map",
|
||||
"SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.",
|
||||
"SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.",
|
||||
"SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.",
|
||||
"SystemFolderConfigDialog_SentFolderHeader": "Verzonden map",
|
||||
"SystemFolderConfigDialog_Title": "Systeemmappen configureren",
|
||||
"SystemFolderConfigDialogValidation_DuplicateSystemFolders": "Sommige systeemmappen worden meerdere malen gebruikt in de configuratie.",
|
||||
"SystemFolderConfigDialogValidation_InboxSelected": "U kunt de map Inbox niet aan een andere systeemmap toewijzen.",
|
||||
"SystemFolderConfigSetupSuccess_Message": "Systeemmappen zijn succesvol geconfigureerd.",
|
||||
"SystemFolderConfigDialogValidation_DuplicateSystemFolders": "Some of the system folders are used more than once in the configuration.",
|
||||
"SystemFolderConfigDialogValidation_InboxSelected": "You can't assign Inbox folder to any other system folder.",
|
||||
"SystemFolderConfigSetupSuccess_Message": "System folders are successfully configured.",
|
||||
"SystemFolderConfigSetupSuccess_Title": "Systeemmappen instellen",
|
||||
"TestingImapConnectionMessage": "Bezig met testen van serververbinding...",
|
||||
"TitleBarServerDisconnectedButton_Description": "Wino is van de netwerkverbinding verbroken. Klik op opnieuw verbinden om de verbinding te herstellen.",
|
||||
"TitleBarServerDisconnectedButton_Title": "Geen verbinding",
|
||||
"TitleBarServerReconnectButton_Title": "Opnieuw verbinden",
|
||||
"TitleBarServerReconnectingButton_Title": "Aan het verbinden",
|
||||
"TestingImapConnectionMessage": "Testing server connection...",
|
||||
"TitleBarServerDisconnectedButton_Description": "Wino is disconnected from the network. Click reconnect to restore connection.",
|
||||
"TitleBarServerDisconnectedButton_Title": "geen verbinding",
|
||||
"TitleBarServerReconnectButton_Title": "opnieuw verbinden",
|
||||
"TitleBarServerReconnectingButton_Title": "verbinden",
|
||||
"Today": "Vandaag",
|
||||
"UnknownAddress": "Onbekend adres",
|
||||
"UnknownDateHeader": "Onbekende datum",
|
||||
"UnknownGroupAddress": "Onbekend adres e-mailgroep",
|
||||
"UnknownGroupAddress": "unknown Mail Group Address",
|
||||
"UnknownSender": "Onbekende afzender",
|
||||
"Unsubscribe": "Uitschrijven",
|
||||
"Unsubscribe": "Afmelden",
|
||||
"ViewContactDetails": "Bekijk details",
|
||||
"WinoUpgradeDescription": "Wino biedt 3 gratis accounts om mee te starten. Als u meer dan 3 accounts nodig heeft, upgrade dan alstublieft",
|
||||
"WinoUpgradeMessage": "Upgraden naar Onbeperkte aantal accounts",
|
||||
"WinoUpgradeMessage": "Upgraden naar Onbeperkte accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} van de {1} gratis accounts gebruikt.",
|
||||
"Yesterday": "Gisteren",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Gisteren"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Typ konta",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Weryfikacja serwera IMAP się nie powiodła.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Ten serwer żąda SSL handshake, aby kontynuować. Proszę potwierdzić szczegóły certyfikatu poniżej.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Zezwól na kontynuowanie konfiguracji konta przez handshake.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Własny motyw",
|
||||
"SettingsDeleteAccount_Description": "Usuń wszystkie e-maile i dane uwierzytelniające powiązane z tym kontem.",
|
||||
"SettingsDeleteAccount_Title": "Usuń to konto",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Czy Wino powinno poprosić Cię o potwierdzenie za każdym razem, gdy próbujesz trwale usunąć wiadomość za pomocą kombinacji Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Ochrona przed trwałym usunięciem",
|
||||
"SettingsDiagnostics_Description": "Dla programistów",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Pokaż podgląd tekstu",
|
||||
"SettingsShowSenderPictures_Description": "Ukryj/pokaż miniaturki zdjęć nadawcy.",
|
||||
"SettingsShowSenderPictures_Title": "Pokaż awatary nadawcy",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Dodaj podpis",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Dodaj własny podpis",
|
||||
"SettingsSignature_DeleteSignature_Title": "Usuń podpis",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Wątkowanie konwersacji",
|
||||
"SettingsUnlinkAccounts_Description": "Usuń łącze pomiędzy kontami. To nie spowoduje usunięcie Twoich kont.",
|
||||
"SettingsUnlinkAccounts_Title": "Odłącz konto",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Czy na pewno chcesz usunąć podpis \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Usuń podpis",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Nazwij swój podpis",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino oferuje 3 konta za darmo. Jeśli potrzebujesz więcej niż trzy konta, proszę wykup pakiet dodający tę funkcję",
|
||||
"WinoUpgradeMessage": "Ulepsz do nielimitowanych kont",
|
||||
"WinoUpgradeRemainingAccountsMessage": "Wykorzystano {0} z {1} darmowych kont.",
|
||||
"Yesterday": "Wczoraj",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Wczoraj"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Tipo de conta",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Êxito",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Verificado com sucesso",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Sucesso",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "Configurações do IMAP salvas com sucesso.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Validação do servidor IMAP falhou.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Este servidor está solicitando um Handshake SSL para continuar. Por favor, confirme os detalhes do certificado abaixo.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Permitir que o handshake continue configurando a sua conta.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Tema Personalizado",
|
||||
"SettingsDeleteAccount_Description": "Apague todos os e-mails e credenciais associados a esta conta.",
|
||||
"SettingsDeleteAccount_Title": "Apagar esta conta",
|
||||
"SettingsDeleteProtection_Description": "O Wino deve solicitar confirmação sempre que você tentar excluir permanentemente um e-mail usando as teclas Shift + Del?",
|
||||
"SettingsDeleteProtection_Description": "O Wino deveria pedir para confirmar toda vez que você tentar excluir permanentemente um e-mail usando as teclas Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Proteção de exclusão permanente",
|
||||
"SettingsDiagnostics_Description": "Para desenvolvedores",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Compartilhe esta identificação com os desenvolvedores quando solicitado para obter ajuda para os problemas que você experimentar no Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Mostrar Pré-visualização de Texto",
|
||||
"SettingsShowSenderPictures_Description": "Ocultar/exibir imagens do remetente da miniatura.",
|
||||
"SettingsShowSenderPictures_Title": "Mostrar Avatares de Remetentes",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Usar gravatar (se disponível) como imagem do remetente",
|
||||
"SettingsEnableFavicons_Title": "Ícones de domínio (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Usar os favicons de domínio (se disponível) como imagem do remetente",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Limpar cache de avatares",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Adicionar assinatura",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Adicionar assinatura personalizada",
|
||||
"SettingsSignature_DeleteSignature_Title": "Excluir assinatura",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "* Encadeamento de conversas",
|
||||
"SettingsUnlinkAccounts_Description": "Remova o vínculo entre as contas. Isso não excluirá suas contas.",
|
||||
"SettingsUnlinkAccounts_Title": "Desvincular Contas",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Rótulos de ação",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Mostrar rótulos de ação.",
|
||||
"SignatureDeleteDialog_Message": "Tem certeza que deseja excluir a assinatura \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Excluir assinatura",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Nomeie sua assinatura",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino oferece de graça 3 contas para começar. Se você precisar de mais de 3 contas, por favor, atualize",
|
||||
"WinoUpgradeMessage": "Atualizar para Contas Ilimitadas",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} de {1} contas gratuitas usadas.",
|
||||
"Yesterday": "Ontem",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Intervalo de sincronização de e-mail",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Intervalo de sincronização automática de e-mails (minutos). Esta configuração será aplicada apenas após reiniciar o Wino Mail."
|
||||
"Yesterday": "Ontem"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Tip cont",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Succes",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validare reușită",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Validarea serverului IMAP a eșuat.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Acest server solicită un SSL handshake pentru a continua. Vă rugăm să confirmați detaliile certificatului de mai jos.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Permiteți handshake-ului să continue configurarea contului.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Temă Personalizată",
|
||||
"SettingsDeleteAccount_Description": "Ștergeți toate e-mail-urile și acreditările asociate cu acest cont.",
|
||||
"SettingsDeleteAccount_Title": "Ștergeți acest cont",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Ar trebui ca Wino să vă ceară o confirmare de fiecare dată când încercați să ștergeți definitiv un e-mail folosind tastele Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Protecție Ștergere Permanentă",
|
||||
"SettingsDiagnostics_Description": "Pentru dezvoltatori",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Partajați acest ID cu dezvoltatorii atunci când le cereți ajutor pentru problemele pe care le întâmpinați în Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Afișează textul de previzualizare",
|
||||
"SettingsShowSenderPictures_Description": "Ascundeți/afișați miniaturi imagini expeditor.",
|
||||
"SettingsShowSenderPictures_Title": "Afișați avatarele expeditorului",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Adăugare semnătură",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Adăugare semnătură personalizată",
|
||||
"SettingsSignature_DeleteSignature_Title": "Ștergere semnătură",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Aranjare mesaje în conversație",
|
||||
"SettingsUnlinkAccounts_Description": "Eliminați legătura dintre conturi. Acest lucru nu va șterge conturile dvs.",
|
||||
"SettingsUnlinkAccounts_Title": "Deasociere Conturi",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Sigur doriți să ștergeți semnătura „{0}”?",
|
||||
"SignatureDeleteDialog_Title": "Ștergeți semnătura",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Numiți-vă semnătura",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino oferă 3 conturi pentru început gratuit. Dacă aveți nevoie de mai mult de 3 conturi, vă rugăm să faceți upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade la Conturi Nelimitate",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} din {1} conturi gratuite folosite.",
|
||||
"Yesterday": "Ieri",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Ieri"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Тип учетной записи",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validation successful",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP Server validation failed.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "This server is requesting a SSL handshake to continue. Please confirm the certificate details below.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Allow the handshake to continue setting up your account.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Пользовательская тема",
|
||||
"SettingsDeleteAccount_Description": "Удалите все письма и учетные данные, связанные с этой учетной записью.",
|
||||
"SettingsDeleteAccount_Title": "Удалить эту учетную запись",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Должен ли Wino запрашивать у вас подтверждение каждый раз, когда вы пытаетесь окончательно удалить письмо с помощью клавиш Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Защита от окончательного удаления",
|
||||
"SettingsDiagnostics_Description": "Для разработчиков",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Share this ID with the developers when asked to get help for the issues you experience in Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Показать текст предпросмотра",
|
||||
"SettingsShowSenderPictures_Description": "Скрыть/показать миниатюру изображения отправителя.",
|
||||
"SettingsShowSenderPictures_Title": "Показывать аватары отправителя",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Добавить подпись",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Добавить свою подпись",
|
||||
"SettingsSignature_DeleteSignature_Title": "Удалить подпись",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Беседы",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Отвязать учетные записи",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Вы уверены, что хотите удалить подпись \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Удалить подпись",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Имя вашей подписи",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino предлагает 3 аккаунта для начала бесплатно. Если вам нужно больше 3 аккаунтов, пожалуйста, обновитесь",
|
||||
"WinoUpgradeMessage": "Улучшить до неограниченного количества учетных записей",
|
||||
"WinoUpgradeRemainingAccountsMessage": "Использовано {0} из {1} бесплатных учетных записей.",
|
||||
"Yesterday": "Вчера",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Вчера"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
"AccountSettingsDialog_AccountName": "Zobrazované meno odosielateľa",
|
||||
"AccountSettingsDialog_AccountNamePlaceholder": "napr. Ján Novák",
|
||||
"AccountDetailsPage_Title": "Informácie o účte",
|
||||
"AccountDetailsPage_Description": "Zmena názvu účtu vo Wino a nastavenie požadovaného názvu odosielateľa.",
|
||||
"AccountDetailsPage_Description": "Zmení názov účtu vo Wino a nastaví požadovaný názov odosielateľa.",
|
||||
"AccountDetailsPage_ColorPicker_Title": "Farba účtu",
|
||||
"AccountDetailsPage_ColorPicker_Description": "Priradenie farby novému účtu na zafarbenie jeho symbolu v zozname.",
|
||||
"AccountDetailsPage_ColorPicker_Description": "Priradí farbu novému účtu na zafarbenie jeho symbolu v zozname.",
|
||||
"AddHyperlink": "Pridať",
|
||||
"AppCloseBackgroundSynchronizationWarningTitle": "Synchronizácia na pozadí",
|
||||
"AppCloseStartupLaunchDisabledWarningMessageFirstLine": "Aplikácia sa nebude spúšťať pri spustení systému Windows.",
|
||||
@@ -79,9 +79,9 @@
|
||||
"CalendarAllDayEventSummary": "celodenné udalosti",
|
||||
"CalendarDisplayOptions_Color": "Farba",
|
||||
"CalendarDisplayOptions_Expand": "Rozšíriť",
|
||||
"CalendarItem_DetailsPopup_JoinOnline": "Pripojiť online",
|
||||
"CalendarItem_DetailsPopup_JoinOnline": "Join online",
|
||||
"CalendarItem_DetailsPopup_ViewEventButton": "Zobraziť udalosť",
|
||||
"CalendarItem_DetailsPopup_ViewSeriesButton": "Zobraziť sériu",
|
||||
"CalendarItem_DetailsPopup_ViewSeriesButton": "View series",
|
||||
"CalendarItemAllDay": "celý deň",
|
||||
"CategoriesFolderNameOverride": "Kategórie",
|
||||
"Center": "Na stred",
|
||||
@@ -98,7 +98,7 @@
|
||||
"ComposerToPlaceholder": "na vloženie adresy stlačte enter",
|
||||
"CreateAccountAliasDialog_AliasAddress": "Adresa",
|
||||
"CreateAccountAliasDialog_AliasAddressPlaceholder": "napr. podpora@mojadomena.sk",
|
||||
"CreateAccountAliasDialog_Description": "Uistite sa, že server odchádzajúcej pošty umožňuje odosielanie správ z tohto aliasu.",
|
||||
"CreateAccountAliasDialog_Description": "Uistite sa, že server odchádzajúcej pošty umožňuje odosielanie e-mailov z tohto aliasu.",
|
||||
"CreateAccountAliasDialog_ReplyToAddress": "Adresa na odpoveď",
|
||||
"CreateAccountAliasDialog_ReplyToAddressPlaceholder": "spravca@mojadomena.sk",
|
||||
"CreateAccountAliasDialog_Title": "Vytvoriť alias účtu",
|
||||
@@ -121,7 +121,7 @@
|
||||
"DialogMessage_AliasNotSelectedTitle": "Chýbajúci alias",
|
||||
"DialogMessage_CantDeleteRootAliasMessage": "Koreňový alias nie je možné odstrániť. Je to vaša hlavná identita spojená s nastavením vášho účtu.",
|
||||
"DialogMessage_CantDeleteRootAliasTitle": "Nie je možné odstrániť alias",
|
||||
"DialogMessage_CleanupFolderMessage": "Chcete natrvalo odstrániť všetky správy v tomto priečinku?",
|
||||
"DialogMessage_CleanupFolderMessage": "Chcete natrvalo odstrániť všetky e-maily v tomto priečinku?",
|
||||
"DialogMessage_CleanupFolderTitle": "Vyprázdnenie priečinka",
|
||||
"DialogMessage_ComposerMissingRecipientMessage": "Správa musí obsahovať príjemcu.",
|
||||
"DialogMessage_ComposerValidationFailedTitle": "Overenie zlyhalo",
|
||||
@@ -142,7 +142,7 @@
|
||||
"DialogMessage_InvalidAliasTitle": "Neplatný alias",
|
||||
"DialogMessage_NoAccountsForCreateMailMessage": "Nemáte žiadne účty, aby ste mohli vytvoriť správu.",
|
||||
"DialogMessage_NoAccountsForCreateMailTitle": "Chýbajúci účet",
|
||||
"DialogMessage_PrintingFailedMessage": "Túto správu sa nepodarilo vytlačiť. Výsledok: {0}",
|
||||
"DialogMessage_PrintingFailedMessage": "Tento e-mail sa nepodarilo vytlačiť. Výsledok: {0}",
|
||||
"DialogMessage_PrintingFailedTitle": "Neúspešné",
|
||||
"DialogMessage_PrintingSuccessMessage": "Správa bola odoslaná do tlačiarne.",
|
||||
"DialogMessage_PrintingSuccessTitle": "Úspešné",
|
||||
@@ -154,7 +154,7 @@
|
||||
"DialogMessage_UnlinkAccountsConfirmationTitle": "Odpojiť účty",
|
||||
"DialogMessage_UnsubscribeConfirmationGoToWebsiteConfirmButton": "Prejsť na webstránku",
|
||||
"DialogMessage_UnsubscribeConfirmationGoToWebsiteMessage": "Ak nechcete dostávať správy od {0}, prejdite na ich webovú stránku a odhláste sa z odberu.",
|
||||
"DialogMessage_UnsubscribeConfirmationMailtoMessage": "Nechcete dostávať správy od {0}? Wino zruší odber za vás odoslaním správy z vášho e-mailového účtu na adresu {1}.",
|
||||
"DialogMessage_UnsubscribeConfirmationMailtoMessage": "Nechcete dostávať správy od {0}? Wino zruší odber za vás odoslaním e-mailu z vášho e-mailového účtu na adresu {1}.",
|
||||
"DialogMessage_UnsubscribeConfirmationOneClickMessage": "Nechcete dostávať správy od {0}?",
|
||||
"DialogMessage_UnsubscribeConfirmationTitle": "Zrušiť odber",
|
||||
"DiscordChannelDisclaimerMessage": "Wino nemá vlastný Discord server, ale špeciálny kanál 'wino-mail' je umiestnený na serveri 'Developer Sanctuary'.\nAk chcete získať aktuálne informácie o Wino, pripojte sa k serveru Developer Sanctuary a sledujte kanál 'wino-mail' v časti 'Community Projects'.\n\nBudete presmerovaní na adresu URL servera, pretože Discord nepodporuje pozvánky na kanály.",
|
||||
@@ -214,7 +214,7 @@
|
||||
"FolderOperation_Empty": "Vyprázdniť tento priečinok",
|
||||
"FolderOperation_MarkAllAsRead": "Označiť všetko ako prečítané",
|
||||
"FolderOperation_Move": "Presunúť",
|
||||
"FolderOperation_None": "Žiadne",
|
||||
"FolderOperation_None": "None",
|
||||
"FolderOperation_Pin": "Pripnúť",
|
||||
"FolderOperation_Rename": "Premenovať",
|
||||
"FolderOperation_Unpin": "Odopnúť",
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Typ účtu",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Úspešné",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Overenie úspešné",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Overenie servera IMAP zlyhalo.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Tento server žiada o SSL handshake na pokračovanie. Potvrďte, prosím, údaje o certifikáte uvedené nižšie.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Povoľte handshake a pokračujte v nastavovaní účtu.",
|
||||
@@ -294,7 +292,7 @@
|
||||
"IMAPSetupDialog_Title": "Pokročilá konfigurácia IMAP",
|
||||
"IMAPSetupDialog_Username": "Používateľské meno",
|
||||
"IMAPSetupDialog_UsernamePlaceholder": "jan.novak, jan.novak@mai.sk, mail.sk/jan.novak",
|
||||
"IMAPSetupDialog_UseSameConfig": "Na odosielanie správy použiť rovnaké používateľské meno a heslo",
|
||||
"IMAPSetupDialog_UseSameConfig": "Na odosielanie e-mailu použiť rovnaké používateľské meno a heslo",
|
||||
"Info_AccountCreatedMessage": "Vytvorený účet {0}",
|
||||
"Info_AccountCreatedTitle": "Vytvorenie účtu",
|
||||
"Info_AccountCreationFailedTitle": "Vytvorenie účtu zlyhalo",
|
||||
@@ -325,13 +323,13 @@
|
||||
"Info_FileLaunchFailedTitle": "Nepodarilo sa spustiť súbor",
|
||||
"Info_InvalidAddressMessage": "'{0}' nie je platná e-mailová adresa.",
|
||||
"Info_InvalidAddressTitle": "Neplatná adresa",
|
||||
"Info_InvalidMoveTargetMessage": "Nemôžete presunúť vybrané správy do tohto priečinka.",
|
||||
"Info_InvalidMoveTargetMessage": "Nemôžete presunúť vybrané e-maily do tohto priečinka.",
|
||||
"Info_InvalidMoveTargetTitle": "Neplatný priečinok na presun",
|
||||
"Info_LogsNotFoundMessage": "Nie sú žiadne logy na zdieľanie.",
|
||||
"Info_LogsNotFoundTitle": "Logy sa nenašli",
|
||||
"Info_LogsSavedMessage": "{0} uložené do vybraného priečinka.",
|
||||
"Info_LogsSavedTitle": "Uložené",
|
||||
"Info_MailListSizeResetSuccessMessage": "Veľkosť zoznamu správ bola obnovená.",
|
||||
"Info_MailListSizeResetSuccessMessage": "Veľkosť zoznamu e-mailov bola obnovená.",
|
||||
"Info_MailRenderingFailedMessage": "Táto pošta je poškodená alebo sa nedá otvoriť.\n{0}",
|
||||
"Info_MailRenderingFailedTitle": "Vykreslenie zlyhalo",
|
||||
"Info_MessageCorruptedMessage": "Táto správa je poškodená.",
|
||||
@@ -394,17 +392,17 @@
|
||||
"MailOperation_MoveFocused": "Presunúť do Prioritné",
|
||||
"MailOperation_MoveJunk": "Presunúť do Nevyžiadaná pošta",
|
||||
"MailOperation_MoveOther": "Presunúť do Iné",
|
||||
"MailOperation_Navigate": "Prejsť",
|
||||
"MailOperation_Navigate": "Navigate",
|
||||
"MailOperation_Print": "Tlačiť",
|
||||
"MailOperation_Reply": "Odpovedať",
|
||||
"MailOperation_ReplyAll": "Odpovedať všetkým",
|
||||
"MailOperation_SaveAs": "Uložiť ako",
|
||||
"MailOperation_SetFlag": "Priradiť označenie",
|
||||
"MailOperation_SetFlag": "Nastaviť označenie",
|
||||
"MailOperation_Unarchive": "Obnoviť z archívu",
|
||||
"MailOperation_ViewMessageSource": "Zobraziť zdroj správy",
|
||||
"MailOperation_Zoom": "Priblížiť",
|
||||
"MailsSelected": "Označené položky: {0}",
|
||||
"MarkFlagUnflag": "Označiť ako označené/neoznačené",
|
||||
"MarkFlagUnflag": "Mark as flagged/unflagged",
|
||||
"MarkReadUnread": "Označiť ako prečítané/neprečítané",
|
||||
"MenuManageAccounts": "Spravovať účty",
|
||||
"MenuMergedAccountItemAccountsSuffix": " účty",
|
||||
@@ -467,26 +465,26 @@
|
||||
"SearchPivotName": "Výsledky",
|
||||
"SettingConfigureSpecialFolders_Button": "Konfigurovať",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Title": "Konfigurácia IMAP/SMTP",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Description": "Zmena nastavenia prichádzajúceho/odchádzajúceho servera.",
|
||||
"SettingsEditAccountDetails_IMAPConfiguration_Description": "Zmeňte nastavenia prichádzajúceho/odchádzajúceho servera.",
|
||||
"SettingsAbout_Description": "Ďalšie informácie o Wino.",
|
||||
"SettingsAbout_Title": "O aplikácii",
|
||||
"SettingsAboutGithub_Description": "Prejsť na systém sledovania chýb repozitára na Githube.",
|
||||
"SettingsAboutGithub_Title": "GitHub",
|
||||
"SettingsAboutVersion": "Verzia ",
|
||||
"SettingsAboutWinoDescription": "Zjednodušený poštový klient pre zariadenia s Windowsom.",
|
||||
"SettingsAccentColor_Description": "Zmena farby motívu aplikácie",
|
||||
"SettingsAccentColor_Description": "Zmení farbu motívu aplikácie",
|
||||
"SettingsAccentColor_Title": "Farba motívu",
|
||||
"SettingsAccentColor_UseWindowsAccentColor": "Použiť moju farbu motívu z Windowsu",
|
||||
"SettingsAccountManagementAppendMessage_Description": "Vytvoriť kópiu správy v priečinku Odoslané po odoslaní konceptu. Túto funkciu zapnite, ak po odoslaní správy v priečinku Odoslané nevidíte svoje správy.",
|
||||
"SettingsAccountManagementAppendMessage_Description": "Vytvorí kópiu správy v priečinku Odoslané po odoslaní konceptu. Túto funkciu zapnite, ak po odoslaní pošty v priečinku Odoslané nevidíte svoje správy.",
|
||||
"SettingsAccountManagementAppendMessage_Title": "Pripojiť správy do priečinka Odoslané",
|
||||
"SettingsAccountName_Description": "Zmena názvu účtu.",
|
||||
"SettingsAccountName_Description": "Zmení názov účtu.",
|
||||
"SettingsAccountName_Title": "Názov účtu",
|
||||
"SettingsApplicationTheme_Description": "Prispôsobte si Wino pomocou rôznych vlastných motívov aplikácie, ktoré sa vám budú páčiť.",
|
||||
"SettingsApplicationTheme_Title": "Motív aplikácie",
|
||||
"SettingsAppPreferences_CloseBehavior_Description": "Čo sa má stať po zatvorení aplikácie?",
|
||||
"SettingsAppPreferences_CloseBehavior_Title": "Akcia pri zatváraní aplikácie",
|
||||
"SettingsAppPreferences_Description": "Všeobecné nastavenia/predvoľby pre Wino Mail.",
|
||||
"SettingsAppPreferences_SearchMode_Description": "Nastavte, či má Wino pri vyhľadávaní najprv skontrolovať načítané správy, alebo vyhľadávať online. Lokálne vyhľadávanie je vždy rýchlejšie a vždy môžete vykonať online vyhľadávanie, ak sa vaša pošta nenachádza vo výsledkoch vyhľadávania.",
|
||||
"SettingsAppPreferences_Description": "Všeobecné nastavenia / predvoľby pre Wino Mail.",
|
||||
"SettingsAppPreferences_SearchMode_Description": "Nastavte, či má Wino pri vyhľadávaní najprv skontrolovať načítané e-maily, alebo vyhľadávať online. Lokálne vyhľadávanie je vždy rýchlejšie a vždy môžete vykonať online vyhľadávanie, ak sa vaša pošta nenachádza vo výsledkoch vyhľadávania.",
|
||||
"SettingsAppPreferences_SearchMode_Local": "Lokálne",
|
||||
"SettingsAppPreferences_SearchMode_Online": "Online",
|
||||
"SettingsAppPreferences_SearchMode_Title": "Predvolený režim vyhľadávania",
|
||||
@@ -496,7 +494,7 @@
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Title": "Minimalizovať na panel úloh",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Terminate_Description": "Wino Mail nebude nikde bežať. Nebudete upozornení na príchod novej pošty. Ak chcete pokračovať v synchronizácii pošty, znovu spustite Wino Mail.",
|
||||
"SettingsAppPreferences_ServerBackgroundingMode_Terminate_Title": "Ukončiť",
|
||||
"SettingsAppPreferences_StartupBehavior_Description": "Povoliť aplikácii Wino Mail, aby sa spúšťala minimalizovaná pri spustení Windowsu. Stále umožňuje prijímať oznámenia.",
|
||||
"SettingsAppPreferences_StartupBehavior_Description": "Povoľuje, aby sa aplikácia Wino Mail spúšťala minimalizovaná pri spustení Windowsu. Stále umožňuje prijímať oznámenia.",
|
||||
"SettingsAppPreferences_StartupBehavior_Disable": "Zakázať",
|
||||
"SettingsAppPreferences_StartupBehavior_Disabled": "Wino Mail sa nespustí pri spustení Windowsu. To spôsobí, že po reštarte počítača vám nebudú zobrazovať oznámenia.",
|
||||
"SettingsAppPreferences_StartupBehavior_DisabledByPolicy": "Správca alebo skupinové politiky zakázali spúšťanie aplikácií pri spustení. Wino Mail teda nie je možné nastaviť tak, aby sa spúšťal pri spustení Windowsu.",
|
||||
@@ -510,18 +508,18 @@
|
||||
"SettingsAutoSelectNextItem_Title": "Automaticky vybrať ďalšiu položku",
|
||||
"SettingsAvailableThemes_Description": "Vyberte motív z vlastnej kolekcie Wino podľa svojho vkusu alebo použite vlastné motívy.",
|
||||
"SettingsAvailableThemes_Title": "Dostupné motívy",
|
||||
"SettingsCalendarSettings_Description": "Zmena prvého dňa v týždni, výška bunky hodiny a ďalšie…",
|
||||
"SettingsCalendarSettings_Description": "Change first day of week, hour cell height and more...",
|
||||
"SettingsCalendarSettings_Title": "Nastavenia kalendára",
|
||||
"SettingsComposer_Title": "Editor",
|
||||
"SettingsComposerFont_Title": "Predvolené písmo editora",
|
||||
"SettingsComposerFontFamily_Description": "Zmena predvolenej rodiny písma a veľkosť písma pri písaní správ.",
|
||||
"SettingsComposerFontFamily_Description": "Zmení predvolenú rodinu písma a veľkosť písma pri písaní správ.",
|
||||
"SettingsConfigureSpecialFolders_Description": "Nastavenie priečinkov so špeciálnymi funkciami. Priečinky ako Archív, Doručená pošta a Koncepty sú nevyhnutné pre správne fungovanie aplikácie Wino.",
|
||||
"SettingsConfigureSpecialFolders_Title": "Konfigurácia systémových priečinkov",
|
||||
"SettingsCustomTheme_Description": "Vytvorte si vlastný motív s vlastným pozadím a farbou motívu.",
|
||||
"SettingsCustomTheme_Title": "Vlastný motív",
|
||||
"SettingsDeleteAccount_Description": "Odstránenie všetkých správ a prihlasovacích údajov spojených s týmto účtom.",
|
||||
"SettingsDeleteAccount_Description": "Odstráni všetky správy a prihlasovacie údaje spojené s týmto účtom.",
|
||||
"SettingsDeleteAccount_Title": "Odstrániť tento účet",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Mal by vás Wino žiadať o potvrdenie vždy, keď budete chcieť trvalo odstrániť poštu pomocou klávesov Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Ochrana pred trvalým odstránením",
|
||||
"SettingsDiagnostics_Description": "Pre vývojárov",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Zdieľajte toto ID s vývojármi, keď budete požiadaní o pomoc pri problémoch, ktoré sa vám vyskytnú v aplikácii Wino Mail.",
|
||||
@@ -529,178 +527,169 @@
|
||||
"SettingsDiagnostics_Title": "Diagnostika",
|
||||
"SettingsDiscord_Description": "Získajte pravidelné informácie o vývoji, zapojte sa do diskusií o pláne vývoja a poskytnite spätnú väzbu.",
|
||||
"SettingsDiscord_Title": "Kanál Discord",
|
||||
"SettingsEditLinkedInbox_Description": "Pridať/odstrániť účty, premenovať alebo zrušiť prepojenie medzi účtami.",
|
||||
"SettingsEditLinkedInbox_Title": "Upraviť prepojenie priečinka doručenej pošty",
|
||||
"SettingsElementTheme_Description": "Vyberte Windows motív pre Wino",
|
||||
"SettingsElementTheme_Title": "Motív prvku",
|
||||
"SettingsElementThemeSelectionDisabled": "Výber motívu prvku je zakázaný, ak je vybraný iný motív aplikácie ako predvolený.",
|
||||
"SettingsEnableHoverActions_Title": "Zapnúť akcie pri prechode myšou",
|
||||
"SettingsEnableIMAPLogs_Description": "Povoliť poskytnutie podrobností o problémoch s pripojením IMAP, ktoré ste mali počas nastavenia servera IMAP.",
|
||||
"SettingsEnableIMAPLogs_Title": "Povoliť logy protokolu IMAP",
|
||||
"SettingsEnableLogs_Description": "Na diagnostiku problémov, ktoré ste otvorili na GitHube, budem možno potrebovať logy o pádoch. Žiadne z protokolov nezverejnia vaše prihlasovacie údaje ani citlivé informácie.",
|
||||
"SettingsEnableLogs_Title": "Zapnúť logy",
|
||||
"SettingsEnableSignature": "Zapnúť podpis",
|
||||
"SettingsExpandOnStartup_Description": "Nastavte, či má Wino pri spustení rozbaliť priečinky tohto účtu.",
|
||||
"SettingsExpandOnStartup_Title": "Rozbalenie ponuky pri spustení",
|
||||
"SettingsExternalContent_Description": "Správa nastavení externého obsahu pri zobrazovaní správ.",
|
||||
"SettingsExternalContent_Title": "Externý obsah",
|
||||
"SettingsFocusedInbox_Description": "Nastavte, či sa má schránka doručených správ rozdeliť na dve časti ako Prioritné – Iné.",
|
||||
"SettingsFocusedInbox_Title": "Prioritné",
|
||||
"SettingsFolderMenuStyle_Description": "Zmena, či priečinky účtu majú byť vnorené do položky ponuky účtu alebo nie. Prepnite, ak sa vám páči starý systém ponuky vo Windows Mail",
|
||||
"SettingsFolderMenuStyle_Title": "Vytvoriť vnorené priečinky",
|
||||
"SettingsFolderOptions_Description": "Zmena nastavení jednotlivých priečinkov, napríklad zapnutie/vypnutie synchronizácie alebo zobrazenie/skrytie odznaku neprečítaného.",
|
||||
"SettingsFolderOptions_Title": "Konfigurácia priečinka",
|
||||
"SettingsFolderSync_Description": "Zapnúť alebo vypnúť synchronizáciu pre konkrétne priečinky.",
|
||||
"SettingsFolderSync_Title": "Synchronizácia priečinkov",
|
||||
"SettingsFontFamily_Title": "Rodina písma",
|
||||
"SettingsFontPreview_Title": "Náhľad",
|
||||
"SettingsFontSize_Title": "Veľkosť písma",
|
||||
"SettingsHoverActionCenter": "Stredná akcia",
|
||||
"SettingsHoverActionLeft": "Ľavá akcia",
|
||||
"SettingsHoverActionRight": "Pravá akcia",
|
||||
"SettingsHoverActions_Description": "Vyberte 3 akcie, ktoré sa zobrazia, keď kurzorom prejdete na správy.",
|
||||
"SettingsHoverActions_Title": "Akcie pri prejdení myšou",
|
||||
"SettingsLanguage_Description": "Zmeniť jazyk aplikácie Wino.",
|
||||
"SettingsEditLinkedInbox_Description": "Add / remove accounts, rename or break the link between accounts.",
|
||||
"SettingsEditLinkedInbox_Title": "Edit Linked Inbox",
|
||||
"SettingsElementTheme_Description": "Select a Windows theme for Wino",
|
||||
"SettingsElementTheme_Title": "Element Theme",
|
||||
"SettingsElementThemeSelectionDisabled": "Element theme selection is disabled when application theme is selected other than Default.",
|
||||
"SettingsEnableHoverActions_Title": "Enable hover actions",
|
||||
"SettingsEnableIMAPLogs_Description": "Enable this to provide details about IMAP connectivity issuses you had during IMAP server setup.",
|
||||
"SettingsEnableIMAPLogs_Title": "Enable IMAP Protocol Logs",
|
||||
"SettingsEnableLogs_Description": "I might need logs for crashes to diagnose issues you have opened in GitHub. None of the logs will expose your credentials or sensetive information to public.",
|
||||
"SettingsEnableLogs_Title": "Enable Logs",
|
||||
"SettingsEnableSignature": "Enable Signature",
|
||||
"SettingsExpandOnStartup_Description": "Set whether Wino should expand this account's folders on startup.",
|
||||
"SettingsExpandOnStartup_Title": "Expand Menu on Startup",
|
||||
"SettingsExternalContent_Description": "Manage external content settings when rendering mails.",
|
||||
"SettingsExternalContent_Title": "External Content",
|
||||
"SettingsFocusedInbox_Description": "Set whether Inbox should be split into two as Focused - Other.",
|
||||
"SettingsFocusedInbox_Title": "Focused Inbox",
|
||||
"SettingsFolderMenuStyle_Description": "Change whether account folders should be nested inside an account menu item or not. Toggle this off if you like the old menu system in Windows Mail",
|
||||
"SettingsFolderMenuStyle_Title": "Create Nested Folders",
|
||||
"SettingsFolderOptions_Description": "Change individual folder settings like enable/disable sync or show/hide unread badge.",
|
||||
"SettingsFolderOptions_Title": "Folder Configuration",
|
||||
"SettingsFolderSync_Description": "Enable or disable specific folders for synchronization.",
|
||||
"SettingsFolderSync_Title": "Folder Synchronization",
|
||||
"SettingsFontFamily_Title": "Font Family",
|
||||
"SettingsFontPreview_Title": "Preview",
|
||||
"SettingsFontSize_Title": "Font Size",
|
||||
"SettingsHoverActionCenter": "Center Action",
|
||||
"SettingsHoverActionLeft": "Left Action",
|
||||
"SettingsHoverActionRight": "Right Action",
|
||||
"SettingsHoverActions_Description": "Select 3 actions to show up when you hover over the mails with cursor.",
|
||||
"SettingsHoverActions_Title": "Hover Actions",
|
||||
"SettingsLanguage_Description": "Change display language for Wino.",
|
||||
"SettingsLanguage_Title": "Jazyk",
|
||||
"SettingsLanguageTime_Description": "Jazyk zobrazenia Wino, preferovaný formát času.",
|
||||
"SettingsLanguageTime_Title": "Jazyk a čas",
|
||||
"SettingsLinkAccounts_Description": "Zlúčenie viacerých účtov do jedného. Zobrazí všetky správy z účtov na jednom mieste.",
|
||||
"SettingsLinkAccounts_Title": "Vytvoriť prepojené účty",
|
||||
"SettingsLinkedAccountsSave_Description": "Úprava aktuálneho prepojenia s novými účtami.",
|
||||
"SettingsLinkedAccountsSave_Description": "Upraví aktuálne prepojenie s novými účtami.",
|
||||
"SettingsLinkedAccountsSave_Title": "Uložiť zmeny",
|
||||
"SettingsLoadImages_Title": "Automatické načítanie obrázkov",
|
||||
"SettingsLoadPlaintextLinks_Title": "Konverzia obyčajných textových odkazov na odkazy, na ktoré sa dá kliknúť",
|
||||
"SettingsLoadStyles_Title": "Automatické načítanie štýlov",
|
||||
"SettingsMailListActionBar_Description": "Zobraziť/skryť panel akcií v hornej časti zoznamu správ.",
|
||||
"SettingsMailListActionBar_Description": "Zobrazí/skryje panel akcií v hornej časti zoznamu správ.",
|
||||
"SettingsMailListActionBar_Title": "Zobrazenie akcií zoznamu správ",
|
||||
"SettingsMailSpacing_Description": "Upraviť rozstupy medzi správami v zozname.",
|
||||
"SettingsMailSpacing_Description": "Upraví rozstupy medzi správami v zozname.",
|
||||
"SettingsMailSpacing_Title": "Rozstup medzi správami",
|
||||
"SettingsManageAccountSettings_Description": "Oznámenia, podpisy, synchronizácia a ďalšie nastavenia pre jednotlivé účty.",
|
||||
"SettingsManageAccountSettings_Title": "Správa nastavení účtov",
|
||||
"SettingsManageAliases_Description": "Pozrite si e-mailové aliasy priradené tomuto účtu, aktualizujte ich alebo odstráňte.",
|
||||
"SettingsManageAliases_Title": "Aliasy",
|
||||
"SettingsEditAccountDetails_Title": "Úprava podrobností o účte",
|
||||
"SettingsEditAccountDetails_Description": "Zmeňte názov účtu, meno odosielateľa a priraďte novú farbu, ak chcete.",
|
||||
"SettingsManageLink_Description": "Presunutím položiek môžete pridať nové prepojenie alebo odstrániť existujúce prepojenie.",
|
||||
"SettingsManageLink_Title": "Správa prepojení",
|
||||
"SettingsMarkAsRead_Description": "Zmena toho, čo sa má stať s vybranou položkou.",
|
||||
"SettingsMarkAsRead_DontChange": "Neoznačovať automaticky položku ako prečítanú",
|
||||
"SettingsMarkAsRead_SecondsToWait": "Čakanie (sekundy): ",
|
||||
"SettingsMarkAsRead_Timer": "Pri zobrazení na table na čítanie",
|
||||
"SettingsMarkAsRead_Title": "Označiť položku ako prečítanú",
|
||||
"SettingsMarkAsRead_WhenSelected": "Po výbere",
|
||||
"SettingsMessageList_Description": "Zmena spôsobu usporiadania správ v zozname správ.",
|
||||
"SettingsMessageList_Title": "Zoznam správ",
|
||||
"SettingsNoAccountSetupMessage": "Zatiaľ ste nenastavili žiadne účty.",
|
||||
"SettingsNotifications_Description": "Zapnutie alebo vypnutie oznámení pre tento účet.",
|
||||
"SettingsNotifications_Title": "Oznámenia",
|
||||
"SettingsNotificationsAndTaskbar_Description": "Zmena zobrazenia oznámení a odznaku na paneli úloh pre tento účet.",
|
||||
"SettingsNotificationsAndTaskbar_Title": "Oznámenia a panel úloh",
|
||||
"SettingsOptions_Title": "Nastavenia",
|
||||
"SettingsPaneLengthReset_Description": "Ak máte problém so zoznamom správ, obnovte ho na predvolenú veľkosť.",
|
||||
"SettingsPaneLengthReset_Title": "Obnoviť veľkosť zoznamu správ",
|
||||
"SettingsPaypal_Description": "Prejavte oveľa viac lásky ❤️ Všetky dary sú vítané.",
|
||||
"SettingsPaypal_Title": "Prispieť cez PayPal",
|
||||
"SettingsPersonalization_Description": "Zmeňte vzhľad aplikácie Wino podľa svojich predstáv.",
|
||||
"SettingsPersonalization_Title": "Prispôsobenie",
|
||||
"SettingsPersonalizationMailDisplayCompactMode": "Kompaktný režim",
|
||||
"SettingsPersonalizationMailDisplayMediumMode": "Stredný režim",
|
||||
"SettingsPersonalizationMailDisplaySpaciousMode": "Priestranný režim",
|
||||
"SettingsPrefer24HourClock_Description": "Časy prijatia správy sa budú zobrazovať v 24-hodinovom formáte namiesto 12-hodinového (AM/PM)",
|
||||
"SettingsPrefer24HourClock_Title": "Zobraziť 24-hodinový formát času",
|
||||
"SettingsPrivacyPolicy_Description": "Prečítajte si Ochranu osobných údajov.",
|
||||
"SettingsPrivacyPolicy_Title": "Ochrany osobných údajov",
|
||||
"SettingsReadComposePane_Description": "Písmo, externý obsah.",
|
||||
"SettingsReadComposePane_Title": "Prehliadač a editor",
|
||||
"SettingsReader_Title": "Prehliadač",
|
||||
"SettingsReaderFont_Title": "Predvolené písmo prehliadača",
|
||||
"SettingsReaderFontFamily_Description": "Zmena predvolenej rodiny a veľkosti písma na čítanie správ.",
|
||||
"SettingsRenameMergeAccount_Description": "Zmena zobrazovaného názvu prepojených účtov.",
|
||||
"SettingsRenameMergeAccount_Title": "Premenovať",
|
||||
"SettingsReorderAccounts_Description": "Zmena poradia účtov v zozname účtov.",
|
||||
"SettingsReorderAccounts_Title": "Zmena poradia účtov",
|
||||
"SettingsSemanticZoom_Description": "Umožní vám kliknúť na záhlavie v zozname správ a prejsť na konkrétny dátum",
|
||||
"SettingsSemanticZoom_Title": "Sémantické priblíženie pre záhlavie dátumu",
|
||||
"SettingsShowPreviewText_Description": "Skryť/zobraziť text náhľadu.",
|
||||
"SettingsShowPreviewText_Title": "Zobraziť náhľad textu",
|
||||
"SettingsShowSenderPictures_Description": "Skryť/zobraziť miniatúry obrázkov odosielateľa.",
|
||||
"SettingsShowSenderPictures_Title": "Zobraziť avatary odosielateľa",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Pridať podpis",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Pridanie vlastného podpisu",
|
||||
"SettingsSignature_DeleteSignature_Title": "Odstránenie podpisu",
|
||||
"SettingsSignature_Description": "Správa podpisov účtu",
|
||||
"SettingsSignature_EditSignature_Title": "Upravenie podpisu",
|
||||
"SettingsSignature_ForFollowingMessages_Title": "Pre odpovede/preposlanie",
|
||||
"SettingsSignature_ForNewMessages_Title": "Pre nové správy",
|
||||
"SettingsSignature_NoneSignatureName": "Žiadny",
|
||||
"SettingsSignature_SignatureDefaults": "Predvolené nastavenia podpisu",
|
||||
"SettingsSignature_Signatures": "Podpisy",
|
||||
"SettingsSignature_Title": "Podpis",
|
||||
"SettingsStartupItem_Description": "Pri spustení zobraziť doručenú poštu pre tento účet.",
|
||||
"SettingsStartupItem_Title": "Účet po spustení",
|
||||
"SettingsStore_Description": "Ukážte trochu lásky ❤️",
|
||||
"SettingsStore_Title": "Hodnotenie v Microsoft Store",
|
||||
"SettingsTaskbarBadge_Description": "Zahrnúť počet neprečítaných správ do ikony na paneli úloh.",
|
||||
"SettingsTaskbarBadge_Title": "Odznak na paneli úloh",
|
||||
"SettingsThreads_Description": "Usporiadanie správ do konverzácií.",
|
||||
"SettingsThreads_Title": "Zobrazenie v režime konverzácie",
|
||||
"SettingsUnlinkAccounts_Description": "Odstránenie prepojenia medzi účtami. Tým sa vaše účty neodstránia.",
|
||||
"SettingsUnlinkAccounts_Title": "Odpojenie účtov",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Naozaj chcete odstrániť podpis \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Odstránenie podpisu",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Pomenujte podpis",
|
||||
"SignatureEditorDialog_SignatureName_TitleEdit": "Aktuálny názov podpisu: {0}",
|
||||
"SignatureEditorDialog_SignatureName_TitleNew": "Názov podpisu",
|
||||
"SignatureEditorDialog_Title": "Editor podpisu",
|
||||
"SortingOption_Date": "podľa dátumu",
|
||||
"SortingOption_Name": "podľa mena",
|
||||
"StoreRatingDialog_MessageFirstLine": "Všetky pripomienky sú vítané a urobia Wino oveľa lepším v budúcnosti. Chcete ohodnotiť Wino v obchode Microsoft Store?",
|
||||
"StoreRatingDialog_MessageSecondLine": "Chcete ohodnotiť aplikáciu Wino Mail v obchode Microsoft Store?",
|
||||
"StoreRatingDialog_Title": "Páči sa vám Wino?",
|
||||
"SynchronizationFolderReport_Failed": "synchronizácia zlyhala",
|
||||
"SynchronizationFolderReport_Success": "aktuálne",
|
||||
"SystemFolderConfigDialog_ArchiveFolderDescription": "Archivované správy budú presunuté sem.",
|
||||
"SystemFolderConfigDialog_ArchiveFolderHeader": "Priečinok Archív",
|
||||
"SystemFolderConfigDialog_DeletedFolderDescription": "Odstránené správy budú presunuté sem.",
|
||||
"SystemFolderConfigDialog_DeletedFolderHeader": "Odstránený priečinok",
|
||||
"SystemFolderConfigDialog_DraftFolderDescription": "Nové správy/odpovede sa budú vytvárať tu.",
|
||||
"SystemFolderConfigDialog_DraftFolderHeader": "Priečinok Koncepty",
|
||||
"SystemFolderConfigDialog_JunkFolderDescription": "Všetka nevyžiadané správy budú tu.",
|
||||
"SystemFolderConfigDialog_JunkFolderHeader": "Priečinok Nevyžiadaná pošta",
|
||||
"SystemFolderConfigDialog_MessageFirstLine": "Tento server IMAP nepodporuje rozšírenie SPECIAL-USE, preto Wino nemohol správne nastaviť systémové priečinky.",
|
||||
"SystemFolderConfigDialog_MessageSecondLine": "Vyberte príslušné priečinky pre konkrétne funkcie.",
|
||||
"SystemFolderConfigDialog_SentFolderDescription": "Odoslané správy sa budú ukladať do tohto priečinka.",
|
||||
"SystemFolderConfigDialog_SentFolderHeader": "Priečinok Odoslaná",
|
||||
"SystemFolderConfigDialog_Title": "Konfigurácia systémových priečinkov",
|
||||
"SystemFolderConfigDialogValidation_DuplicateSystemFolders": "Niektoré systémové priečinky sa v konfigurácii používajú viac ako raz.",
|
||||
"SystemFolderConfigDialogValidation_InboxSelected": "Priečinok Doručená pošta nemôžete priradiť k žiadnemu inému systémovému priečinku.",
|
||||
"SystemFolderConfigSetupSuccess_Message": "Systémové priečinky sú úspešne nakonfigurované.",
|
||||
"SystemFolderConfigSetupSuccess_Title": "Nastavenie systémových priečinkov",
|
||||
"TestingImapConnectionMessage": "Testovanie pripojenia k serveru…",
|
||||
"TitleBarServerDisconnectedButton_Description": "Wino je odpojený od siete. Kliknutím na tlačidlo obnoviť pripojenie obnovte pripojenie.",
|
||||
"TitleBarServerDisconnectedButton_Title": "žiadne pripojenie",
|
||||
"TitleBarServerReconnectButton_Title": "obnoviť pripojenie",
|
||||
"TitleBarServerReconnectingButton_Title": "pripája sa",
|
||||
"Today": "Dnes",
|
||||
"UnknownAddress": "neznáma adresa",
|
||||
"UnknownDateHeader": "Neznámy dátum",
|
||||
"UnknownGroupAddress": "neznáma adresa poštovej skupiny",
|
||||
"UnknownSender": "Neznámy odosielateľ",
|
||||
"Unsubscribe": "Zrušiť odber",
|
||||
"ViewContactDetails": "Zobraziť podrobnosti",
|
||||
"WinoUpgradeDescription": "Wino ponúka na začiatok 3 účty zadarmo. Ak potrebujete viac ako 3 účty, zaplaťte za rozšírenie",
|
||||
"WinoUpgradeMessage": "Navýšiť na neobmedzený počet",
|
||||
"WinoUpgradeRemainingAccountsMessage": "Využitie bezplatných účtov: {0}/{1}.",
|
||||
"Yesterday": "Včera",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"SettingsManageAliases_Title": "Aliases",
|
||||
"SettingsEditAccountDetails_Title": "Edit Account Details",
|
||||
"SettingsEditAccountDetails_Description": "Change account name, sender name and assign a new color if you like.",
|
||||
"SettingsManageLink_Description": "Move items to add new link or remove existing link.",
|
||||
"SettingsManageLink_Title": "Manage Link",
|
||||
"SettingsMarkAsRead_Description": "Change what should happen to the selected item.",
|
||||
"SettingsMarkAsRead_DontChange": "Don't automatically mark item as read",
|
||||
"SettingsMarkAsRead_SecondsToWait": "Seconds to wait: ",
|
||||
"SettingsMarkAsRead_Timer": "When viewed in the reading pane",
|
||||
"SettingsMarkAsRead_Title": "Mark item as read",
|
||||
"SettingsMarkAsRead_WhenSelected": "When selected",
|
||||
"SettingsMessageList_Description": "Change how your messages should be organized in mail list.",
|
||||
"SettingsMessageList_Title": "Message List",
|
||||
"SettingsNoAccountSetupMessage": "You didn't setup any accounts yet.",
|
||||
"SettingsNotifications_Description": "Turn on or off notifications for this account.",
|
||||
"SettingsNotifications_Title": "Notifications",
|
||||
"SettingsNotificationsAndTaskbar_Description": "Change whether notifications should be displayed and taskbar badge for this account.",
|
||||
"SettingsNotificationsAndTaskbar_Title": "Notifications & Taskbar",
|
||||
"SettingsOptions_Title": "Settings",
|
||||
"SettingsPaneLengthReset_Description": "Reset the size of the mail list to original if you have issues with it.",
|
||||
"SettingsPaneLengthReset_Title": "Reset Mail List Size",
|
||||
"SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.",
|
||||
"SettingsPaypal_Title": "Donate via PayPal",
|
||||
"SettingsPersonalization_Description": "Change appearance of Wino as you like.",
|
||||
"SettingsPersonalization_Title": "Personalization",
|
||||
"SettingsPersonalizationMailDisplayCompactMode": "Compact Mode",
|
||||
"SettingsPersonalizationMailDisplayMediumMode": "Medium Mode",
|
||||
"SettingsPersonalizationMailDisplaySpaciousMode": "Spacious Mode",
|
||||
"SettingsPrefer24HourClock_Description": "Mail recieve times will be displayed in 24 hour format instead of 12 (AM/PM)",
|
||||
"SettingsPrefer24HourClock_Title": "Display Clock Format in 24 Hours",
|
||||
"SettingsPrivacyPolicy_Description": "Review privacy policy.",
|
||||
"SettingsPrivacyPolicy_Title": "Privacy Policy",
|
||||
"SettingsReadComposePane_Description": "Fonts, external content.",
|
||||
"SettingsReadComposePane_Title": "Reader & Composer",
|
||||
"SettingsReader_Title": "Reader",
|
||||
"SettingsReaderFont_Title": "Default Reader Font",
|
||||
"SettingsReaderFontFamily_Description": "Change the default font family and font size for reading mails.",
|
||||
"SettingsRenameMergeAccount_Description": "Change the display name of the linked accounts.",
|
||||
"SettingsRenameMergeAccount_Title": "Rename",
|
||||
"SettingsReorderAccounts_Description": "Change the order of accounts in the account list.",
|
||||
"SettingsReorderAccounts_Title": "Reorder Accounts",
|
||||
"SettingsSemanticZoom_Description": "This will allow you to click on the headers in messages list and go to specific date",
|
||||
"SettingsSemanticZoom_Title": "Semantic Zoom for Date Headers",
|
||||
"SettingsShowPreviewText_Description": "Hide/show the preview text.",
|
||||
"SettingsShowPreviewText_Title": "Show Preview Text",
|
||||
"SettingsShowSenderPictures_Description": "Hide/show the thumbnail sender pictures.",
|
||||
"SettingsShowSenderPictures_Title": "Show Sender Avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Add signature",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Add custom signature",
|
||||
"SettingsSignature_DeleteSignature_Title": "Delete signature",
|
||||
"SettingsSignature_Description": "Manage account signatures",
|
||||
"SettingsSignature_EditSignature_Title": "Edit signature",
|
||||
"SettingsSignature_ForFollowingMessages_Title": "For Replies/Forwards",
|
||||
"SettingsSignature_ForNewMessages_Title": "For New Messages",
|
||||
"SettingsSignature_NoneSignatureName": "None",
|
||||
"SettingsSignature_SignatureDefaults": "Signature defaults",
|
||||
"SettingsSignature_Signatures": "Signatures",
|
||||
"SettingsSignature_Title": "Signature",
|
||||
"SettingsStartupItem_Description": "Primary account item to load Inbox at startup.",
|
||||
"SettingsStartupItem_Title": "Startup Item",
|
||||
"SettingsStore_Description": "Show some love ❤️",
|
||||
"SettingsStore_Title": "Rate in Store",
|
||||
"SettingsTaskbarBadge_Description": "Include unread mail count in taskbar icon.",
|
||||
"SettingsTaskbarBadge_Title": "Taskbar Badge",
|
||||
"SettingsThreads_Description": "Organize messages into conversation threads.",
|
||||
"SettingsThreads_Title": "Conversation Threading",
|
||||
"SettingsUnlinkAccounts_Description": "Remove the link between accounts. his will not delete your accounts.",
|
||||
"SettingsUnlinkAccounts_Title": "Unlink Accounts",
|
||||
"SignatureDeleteDialog_Message": "Are you sure you want to delete \"{0}\" signature?",
|
||||
"SignatureDeleteDialog_Title": "Delete signature",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Name your signature",
|
||||
"SignatureEditorDialog_SignatureName_TitleEdit": "Current signature name: {0}",
|
||||
"SignatureEditorDialog_SignatureName_TitleNew": "Signature name",
|
||||
"SignatureEditorDialog_Title": "Signature Editor",
|
||||
"SortingOption_Date": "by date",
|
||||
"SortingOption_Name": "by name",
|
||||
"StoreRatingDialog_MessageFirstLine": "All feedbacks are appreciated and they will make much Wino better in the future. Would you like to rate Wino in Microsoft Store?",
|
||||
"StoreRatingDialog_MessageSecondLine": "Would you like to rate Wino Mail in Microsoft Store?",
|
||||
"StoreRatingDialog_Title": "Enjoying Wino?",
|
||||
"SynchronizationFolderReport_Failed": "synchronization is failed",
|
||||
"SynchronizationFolderReport_Success": "up to date",
|
||||
"SystemFolderConfigDialog_ArchiveFolderDescription": "Archived messages will be moved to here.",
|
||||
"SystemFolderConfigDialog_ArchiveFolderHeader": "Archive Folder",
|
||||
"SystemFolderConfigDialog_DeletedFolderDescription": "Deleted messages will be moved to here.",
|
||||
"SystemFolderConfigDialog_DeletedFolderHeader": "Deleted Folder",
|
||||
"SystemFolderConfigDialog_DraftFolderDescription": "New mails/replies will be crafted in here.",
|
||||
"SystemFolderConfigDialog_DraftFolderHeader": "Draft Folder",
|
||||
"SystemFolderConfigDialog_JunkFolderDescription": "All spam/junk mails will be here.",
|
||||
"SystemFolderConfigDialog_JunkFolderHeader": "Junk/Spam Folder",
|
||||
"SystemFolderConfigDialog_MessageFirstLine": "This IMAP server doesn't support SPECIAL-USE extension hence Wino couldn't setup the system folders properly.",
|
||||
"SystemFolderConfigDialog_MessageSecondLine": "Please select the appropriate folders for specific functionalities.",
|
||||
"SystemFolderConfigDialog_SentFolderDescription": "Folder that sent messages will be stored.",
|
||||
"SystemFolderConfigDialog_SentFolderHeader": "Sent Folder",
|
||||
"SystemFolderConfigDialog_Title": "Configure System Folders",
|
||||
"SystemFolderConfigDialogValidation_DuplicateSystemFolders": "Some of the system folders are used more than once in the configuration.",
|
||||
"SystemFolderConfigDialogValidation_InboxSelected": "You can't assign Inbox folder to any other system folder.",
|
||||
"SystemFolderConfigSetupSuccess_Message": "System folders are successfully configured.",
|
||||
"SystemFolderConfigSetupSuccess_Title": "System Folders Setup",
|
||||
"TestingImapConnectionMessage": "Testing server connection...",
|
||||
"TitleBarServerDisconnectedButton_Description": "Wino is disconnected from the network. Click reconnect to restore connection.",
|
||||
"TitleBarServerDisconnectedButton_Title": "no connection",
|
||||
"TitleBarServerReconnectButton_Title": "reconnect",
|
||||
"TitleBarServerReconnectingButton_Title": "connecting",
|
||||
"Today": "Today",
|
||||
"UnknownAddress": "unknown address",
|
||||
"UnknownDateHeader": "Unknown Date",
|
||||
"UnknownGroupAddress": "unknown Mail Group Address",
|
||||
"UnknownSender": "Unknown Sender",
|
||||
"Unsubscribe": "Unsubscribe",
|
||||
"ViewContactDetails": "View Details",
|
||||
"WinoUpgradeDescription": "Wino offers 3 accounts to start with for free. If you need more than 3 accounts, please upgrade",
|
||||
"WinoUpgradeMessage": "Upgrade to Unlimited Accounts",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} out of {1} free accounts used.",
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Hesap türü",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Başarılı",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Validasyon başarılı",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP sunucusuna bağlanılamadı.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Bu sunucu SSL doğrulaması gerektiriyor. Lütfen aşağıdaki detayları onaylayınız.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Devam etmek için doğrulamayı kabul edin.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Özel Tema",
|
||||
"SettingsDeleteAccount_Description": "Bu hesapa bağlı bütün bilgi ve e-postaları sil.",
|
||||
"SettingsDeleteAccount_Title": "Bu hesabı sil",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Wino her seferinde Shift + Del tuşlarıyla kalıcı olarak silmek istediğiniz e-postalar için uyarı mesajı göstersin mi?",
|
||||
"SettingsDeleteProtection_Title": "Kalıcı Silme Koruması",
|
||||
"SettingsDiagnostics_Description": "Geliştiriciler için",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Bu ID'yi geliştiriciler ile paylaşarak Wino Mail ile yaşadığınız sorunlar hakkında çözümlere ulaşabilirsiniz.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Önizleme",
|
||||
"SettingsShowSenderPictures_Description": "Gönderen resmini göster/gösterme.",
|
||||
"SettingsShowSenderPictures_Title": "Gönderen Resimleri",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "İmza ekle",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Yeni bir imza ekleyin",
|
||||
"SettingsSignature_DeleteSignature_Title": "İmzayı siil",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Mesaj Gruplama",
|
||||
"SettingsUnlinkAccounts_Description": "Hesap bağlantısını koparın. Bu işlem hesaplarınızı silmez.",
|
||||
"SettingsUnlinkAccounts_Title": "Hesap Bağlantısını Kopar",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "{0} imzasını silmek istediğinizden emin misiniz?",
|
||||
"SignatureDeleteDialog_Title": "İmzayı sil",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "İmzaya bir isim verin",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino başlangıç için ücretsiz olarak 3 adet hesap verir. Eğer 3'ten fazla hesap kullanmak istiyorsanız lütfen satın alarak projeye destek olun",
|
||||
"WinoUpgradeMessage": "Sınırsız Hesaba Yükselt",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{1} hesabın {0} tanesi kullanıldı.",
|
||||
"Yesterday": "Dün",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Dün"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "Тип облікового запису",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "Виконано",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "Перевірка успішна",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "Не вдалося перевірити сервер IMAP.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "Цей сервер запитує SSL-рукостискання для продовження. Будь ласка, підтвердьте деталі сертифіката нижче.",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "Дозвольте рукостискання для продовження налаштування вашого облікового запису.",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "Користувацька тема",
|
||||
"SettingsDeleteAccount_Description": "Видалити всі листи та облікові дані, пов'язані з цим обліковим записом.",
|
||||
"SettingsDeleteAccount_Title": "Видалити цей обліковий запис",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "Чи повинен Wino перепитувати Вас щоразу, коли Ви намагаєтесь назавжди видалити лист через комбінацію клавіш Shift + Del?",
|
||||
"SettingsDeleteProtection_Title": "Захист від остаточного видалення",
|
||||
"SettingsDiagnostics_Description": "Для розробників",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "Поділіться цим ID з розробниками, коли попросять, щоб отримати допомогу щодо проблем, з якими Ви зіткнулися у Wino Mail.",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "Попередній перегляд тексту",
|
||||
"SettingsShowSenderPictures_Description": "Приховувати/показувати аватарки відправників.",
|
||||
"SettingsShowSenderPictures_Title": "Аватарки відправників",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "Додати підпис",
|
||||
"SettingsSignature_AddCustomSignature_Title": "Додати користувацький підпис",
|
||||
"SettingsSignature_DeleteSignature_Title": "Видалити підпис",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "Ланцюжки розмов",
|
||||
"SettingsUnlinkAccounts_Description": "Видалити зв'язку між обліковими записами. Це не видалить самі облікові записи.",
|
||||
"SettingsUnlinkAccounts_Title": "Відв'язати облікові записи",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "Ви дійсно бажаєте видалити підпис \"{0}\"?",
|
||||
"SignatureDeleteDialog_Title": "Видалити підпис",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "Назвіть свій підпис",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino пропонує 3 облікові записи для початку безкоштовно. Якщо Вам потрібно більше 3 облікових записів, будь ласка, оновіться",
|
||||
"WinoUpgradeMessage": "Оновити до необмеженої кількості облікових записів",
|
||||
"WinoUpgradeRemainingAccountsMessage": "{0} з {1} безкоштовних облікових записів використано.",
|
||||
"Yesterday": "Вчора",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "Вчора"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -262,8 +262,6 @@
|
||||
"IMAPSetupDialog_AccountType": "账户名称",
|
||||
"IMAPSetupDialog_ValidationSuccess_Title": "成功",
|
||||
"IMAPSetupDialog_ValidationSuccess_Message": "验证成功",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Title": "Success",
|
||||
"IMAPSetupDialog_SaveImapSuccess_Message": "IMAP settings saved successfuly.",
|
||||
"IMAPSetupDialog_ValidationFailed_Title": "IMAP 服务器验证失败。",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row0": "该服务器正在请求 SSL 握手以继续。请确认下方的证书详情。",
|
||||
"IMAPSetupDialog_CertificateAllowanceRequired_Row1": "允许握手并继续设置账户。",
|
||||
@@ -521,7 +519,7 @@
|
||||
"SettingsCustomTheme_Title": "自定义主题",
|
||||
"SettingsDeleteAccount_Description": "删除与此账户关联的所有电子邮件和凭据。",
|
||||
"SettingsDeleteAccount_Title": "删除此账户",
|
||||
"SettingsDeleteProtection_Description": "Should Wino ask you for confirmation every time you try to permanently delete a mail using Shift + Del keys?",
|
||||
"SettingsDeleteProtection_Description": "每次您尝试使用 Shift + Del 键永久删除邮件时,Wino 应该向您二次确认吗?",
|
||||
"SettingsDeleteProtection_Title": "永久性删除保护",
|
||||
"SettingsDiagnostics_Description": "开发者选项",
|
||||
"SettingsDiagnostics_DiagnosticId_Description": "如需联系开发人员请求帮助,请提供此 ID。",
|
||||
@@ -625,11 +623,6 @@
|
||||
"SettingsShowPreviewText_Title": "显示预览文本",
|
||||
"SettingsShowSenderPictures_Description": "隐藏/显示缩略图发件人图片。",
|
||||
"SettingsShowSenderPictures_Title": "显示发件人头像",
|
||||
"SettingsEnableGravatarAvatars_Title": "Gravatar",
|
||||
"SettingsEnableGravatarAvatars_Description": "Use gravatar (if available) as sender picture",
|
||||
"SettingsEnableFavicons_Title": "Domain icons (Favicons)",
|
||||
"SettingsEnableFavicons_Description": "Use domain favicons (if available) as sender picture",
|
||||
"SettingsMailList_ClearAvatarsCache_Button": "Clear cached avatars",
|
||||
"SettingsSignature_AddCustomSignature_Button": "添加签名",
|
||||
"SettingsSignature_AddCustomSignature_Title": "添加自定义签名",
|
||||
"SettingsSignature_DeleteSignature_Title": "删除签名",
|
||||
@@ -651,8 +644,6 @@
|
||||
"SettingsThreads_Title": "邮件会话",
|
||||
"SettingsUnlinkAccounts_Description": "删除账户之间的链接。这不会删除您的账户。",
|
||||
"SettingsUnlinkAccounts_Title": "取消链接账户",
|
||||
"SettingsMailRendering_ActionLabels_Title": "Action labels",
|
||||
"SettingsMailRendering_ActionLabels_Description": "Show action labels.",
|
||||
"SignatureDeleteDialog_Message": "确定要删除签名「{0}」吗?",
|
||||
"SignatureDeleteDialog_Title": "删除签名",
|
||||
"SignatureEditorDialog_SignatureName_Placeholder": "为签名命名",
|
||||
@@ -698,9 +689,7 @@
|
||||
"WinoUpgradeDescription": "Wino 免费使用 3 个邮件账户。如果您需要同时使用 3 个以上的账户,请升级。",
|
||||
"WinoUpgradeMessage": "升级为无限账户数",
|
||||
"WinoUpgradeRemainingAccountsMessage": "已使用 {0} 个免费账户,共 {1} 个。",
|
||||
"Yesterday": "昨天",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Title": "Email sync interval",
|
||||
"SettingsAppPreferences_EmailSyncInterval_Description": "Automatic email synchronization interval (minutes). This setting will be applied only after restarting Wino Mail."
|
||||
"Yesterday": "昨天"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using CommunityToolkit.WinUI.Notifications;
|
||||
using Serilog;
|
||||
using Windows.Data.Xml.Dom;
|
||||
@@ -13,7 +11,7 @@ using Wino.Core.Domain.Entities.Mail;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Core.Domain.Models.MailItem;
|
||||
using Wino.Messaging.UI;
|
||||
using System.IO;
|
||||
|
||||
namespace Wino.Core.UWP.Services;
|
||||
|
||||
@@ -38,11 +36,6 @@ public class NotificationBuilder : INotificationBuilder
|
||||
_folderService = folderService;
|
||||
_mailService = mailService;
|
||||
_thumbnailService = thumbnailService;
|
||||
|
||||
WeakReferenceMessenger.Default.Register<MailReadStatusChanged>(this, (r, msg) =>
|
||||
{
|
||||
RemoveNotification(msg.UniqueId);
|
||||
});
|
||||
}
|
||||
|
||||
public async Task CreateNotificationsAsync(Guid inboxFolderId, IEnumerable<IMailItem> downloadedMailItems)
|
||||
@@ -88,11 +81,7 @@ public class NotificationBuilder : INotificationBuilder
|
||||
foreach (var mailItem in validItems)
|
||||
{
|
||||
if (mailItem.IsRead)
|
||||
{
|
||||
// Remove the notification for a specific mail if it exists
|
||||
ToastNotificationManager.History.Remove(mailItem.UniqueId.ToString());
|
||||
continue;
|
||||
}
|
||||
|
||||
var builder = new ToastContentBuilder();
|
||||
builder.SetToastScenario(ToastScenario.Default);
|
||||
@@ -128,8 +117,7 @@ public class NotificationBuilder : INotificationBuilder
|
||||
Src = new Uri("ms-winsoundevent:Notification.Mail")
|
||||
});
|
||||
|
||||
// Use UniqueId as tag to allow removal
|
||||
builder.Show(toast => toast.Tag = mailItem.UniqueId.ToString());
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
await UpdateTaskbarIconBadgeAsync();
|
||||
@@ -242,16 +230,4 @@ public class NotificationBuilder : INotificationBuilder
|
||||
|
||||
//await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void RemoveNotification(Guid mailUniqueId)
|
||||
{
|
||||
try
|
||||
{
|
||||
ToastNotificationManager.History.Remove(mailUniqueId.ToString());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(ex, $"Failed to remove notification for mail {mailUniqueId}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,12 +290,6 @@ public class PreferencesService(IConfigurationService configurationService) : Ob
|
||||
set => SaveProperty(propertyName: nameof(WorkingDayEnd), value);
|
||||
}
|
||||
|
||||
public int EmailSyncIntervalMinutes
|
||||
{
|
||||
get => _configurationService.Get(nameof(EmailSyncIntervalMinutes), 3);
|
||||
set => SetPropertyAndSave(nameof(EmailSyncIntervalMinutes), value);
|
||||
}
|
||||
|
||||
public CalendarSettings GetCurrentCalendarSettings()
|
||||
{
|
||||
var workingDays = GetDaysBetween(WorkingDayStart, WorkingDayEnd);
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Identity.Client" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="System.Reactive" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -5,7 +5,6 @@ using System.Web;
|
||||
using Google.Apis.Calendar.v3.Data;
|
||||
using Google.Apis.Gmail.v1.Data;
|
||||
using MimeKit;
|
||||
using Wino.Core.Domain;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Entities.Mail;
|
||||
using Wino.Core.Domain.Enums;
|
||||
@@ -179,6 +178,11 @@ public static class GoogleIntegratorExtensions
|
||||
Id = Guid.NewGuid(),
|
||||
TimeZone = calendarListEntry.TimeZone,
|
||||
IsPrimary = calendarListEntry.Primary.GetValueOrDefault(),
|
||||
Description = calendarListEntry.Description,
|
||||
AccessRole = calendarListEntry.AccessRole,
|
||||
CreatedDate = DateTime.UtcNow,
|
||||
LastSyncTime = DateTime.UtcNow,
|
||||
Location = calendarListEntry.Location,
|
||||
};
|
||||
|
||||
// Bg color must present. Generate one if doesnt exists.
|
||||
@@ -190,42 +194,121 @@ public static class GoogleIntegratorExtensions
|
||||
return calendar;
|
||||
}
|
||||
|
||||
public static DateTimeOffset? GetEventDateTimeOffset(EventDateTime calendarEvent)
|
||||
public static CalendarItem MapGoogleEventToCalendarEvent(this Event googleEvent, AccountCalendar calendar)
|
||||
{
|
||||
if (calendarEvent != null)
|
||||
var calendarEvent = new CalendarItem
|
||||
{
|
||||
if (calendarEvent.DateTimeDateTimeOffset != null)
|
||||
RemoteEventId = googleEvent.Id,
|
||||
CalendarId = calendar.Id, // Use internal Guid
|
||||
Title = googleEvent.Summary ?? string.Empty,
|
||||
Description = googleEvent.Description,
|
||||
Location = googleEvent.Location,
|
||||
Status = googleEvent.Status,
|
||||
RecurringEventId = googleEvent.RecurringEventId
|
||||
};
|
||||
|
||||
// Handle start and end times
|
||||
if (googleEvent.Start != null)
|
||||
{
|
||||
if (googleEvent.Start.Date != null)
|
||||
{
|
||||
return calendarEvent.DateTimeDateTimeOffset.Value;
|
||||
calendarEvent.IsAllDay = true;
|
||||
calendarEvent.StartDateTime = DateTime.Parse(googleEvent.Start.Date);
|
||||
}
|
||||
else if (calendarEvent.Date != null)
|
||||
else if (googleEvent.Start.DateTimeDateTimeOffset.HasValue)
|
||||
{
|
||||
if (DateTime.TryParse(calendarEvent.Date, out DateTime eventDateTime))
|
||||
{
|
||||
// Date-only events are treated as UTC midnight
|
||||
return new DateTimeOffset(eventDateTime, TimeSpan.Zero);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Invalid date format in Google Calendar event date.");
|
||||
}
|
||||
calendarEvent.IsAllDay = false;
|
||||
calendarEvent.StartDateTime = googleEvent.Start.DateTimeDateTimeOffset.Value.DateTime;
|
||||
calendarEvent.TimeZone = googleEvent.Start.TimeZone;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
if (googleEvent.End != null)
|
||||
{
|
||||
if (googleEvent.End.Date != null)
|
||||
{
|
||||
calendarEvent.EndDateTime = DateTime.Parse(googleEvent.End.Date);
|
||||
}
|
||||
else if (googleEvent.End.DateTimeDateTimeOffset.HasValue)
|
||||
{
|
||||
calendarEvent.EndDateTime = googleEvent.End.DateTimeDateTimeOffset.Value.DateTime;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle recurrence rules
|
||||
if (googleEvent.Recurrence != null && googleEvent.Recurrence.Count > 0)
|
||||
{
|
||||
calendarEvent.RecurrenceRules = string.Join(";", googleEvent.Recurrence);
|
||||
}
|
||||
|
||||
// Handle organizer
|
||||
if (googleEvent.Organizer != null)
|
||||
{
|
||||
calendarEvent.OrganizerDisplayName = googleEvent.Organizer.DisplayName;
|
||||
calendarEvent.OrganizerEmail = googleEvent.Organizer.Email;
|
||||
}
|
||||
|
||||
// Handle timestamps
|
||||
if (googleEvent.CreatedDateTimeOffset.HasValue)
|
||||
{
|
||||
calendarEvent.CreatedDate = googleEvent.CreatedDateTimeOffset.Value.DateTime;
|
||||
}
|
||||
|
||||
if (googleEvent.UpdatedDateTimeOffset.HasValue)
|
||||
{
|
||||
calendarEvent.LastModified = googleEvent.UpdatedDateTimeOffset.Value.DateTime;
|
||||
}
|
||||
|
||||
// Handle original start time for recurring event instances
|
||||
if (googleEvent.OriginalStartTime != null)
|
||||
{
|
||||
if (googleEvent.OriginalStartTime.Date != null)
|
||||
{
|
||||
calendarEvent.OriginalStartTime = googleEvent.OriginalStartTime.Date;
|
||||
}
|
||||
else if (googleEvent.OriginalStartTime.DateTimeDateTimeOffset.HasValue)
|
||||
{
|
||||
calendarEvent.OriginalStartTime = googleEvent.OriginalStartTime.DateTimeDateTimeOffset.Value.ToString("O");
|
||||
}
|
||||
}
|
||||
|
||||
// Automatically determine the calendar item type based on event properties
|
||||
calendarEvent.DetermineItemType();
|
||||
|
||||
return calendarEvent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as specified in RFC5545.
|
||||
/// Converts a Google Calendar API response status string to AttendeeResponseStatus enum
|
||||
/// </summary>
|
||||
/// <returns>___ separated lines.</returns>
|
||||
public static string GetRecurrenceString(this Event calendarEvent)
|
||||
/// <param name="googleStatus">The status string from Google Calendar API</param>
|
||||
/// <returns>Corresponding AttendeeResponseStatus enum value</returns>
|
||||
public static AttendeeResponseStatus FromGoogleStatus(string? googleStatus)
|
||||
{
|
||||
if (calendarEvent == null || calendarEvent.Recurrence == null || !calendarEvent.Recurrence.Any())
|
||||
return googleStatus?.ToLowerInvariant() switch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
"accepted" => AttendeeResponseStatus.Accepted,
|
||||
"declined" => AttendeeResponseStatus.Declined,
|
||||
"tentative" => AttendeeResponseStatus.Tentative,
|
||||
"needsaction" => AttendeeResponseStatus.NeedsAction,
|
||||
_ => AttendeeResponseStatus.NeedsAction
|
||||
};
|
||||
}
|
||||
|
||||
return string.Join(Constants.CalendarEventRecurrenceRuleSeperator, calendarEvent.Recurrence);
|
||||
/// <summary>
|
||||
/// Converts an AttendeeResponseStatus enum to Google Calendar API response status string
|
||||
/// </summary>
|
||||
/// <param name="status">The AttendeeResponseStatus enum value</param>
|
||||
/// <returns>Corresponding Google Calendar API status string</returns>
|
||||
public static string ToGoogleStatus(AttendeeResponseStatus status)
|
||||
{
|
||||
return status switch
|
||||
{
|
||||
AttendeeResponseStatus.Accepted => "accepted",
|
||||
AttendeeResponseStatus.Declined => "declined",
|
||||
AttendeeResponseStatus.Tentative => "tentative",
|
||||
AttendeeResponseStatus.NeedsAction => "needsAction",
|
||||
_ => "needsAction"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Graph.Models;
|
||||
using MimeKit;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
@@ -127,125 +126,26 @@ public static class OutlookIntegratorExtensions
|
||||
return calendar;
|
||||
}
|
||||
|
||||
private static string GetRfc5545DayOfWeek(DayOfWeekObject dayOfWeek)
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Converts Outlook response status to our enum
|
||||
/// </summary>
|
||||
/// <param name="outlookResponse">Outlook response type</param>
|
||||
/// <returns>AttendeeResponseStatus enum value</returns>
|
||||
public static AttendeeResponseStatus ConvertOutlookResponseStatus(this Microsoft.Graph.Models.ResponseType? outlookResponse)
|
||||
{
|
||||
return dayOfWeek switch
|
||||
return outlookResponse switch
|
||||
{
|
||||
DayOfWeekObject.Monday => "MO",
|
||||
DayOfWeekObject.Tuesday => "TU",
|
||||
DayOfWeekObject.Wednesday => "WE",
|
||||
DayOfWeekObject.Thursday => "TH",
|
||||
DayOfWeekObject.Friday => "FR",
|
||||
DayOfWeekObject.Saturday => "SA",
|
||||
DayOfWeekObject.Sunday => "SU",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(dayOfWeek), dayOfWeek, null)
|
||||
Microsoft.Graph.Models.ResponseType.Accepted => AttendeeResponseStatus.Accepted,
|
||||
Microsoft.Graph.Models.ResponseType.Declined => AttendeeResponseStatus.Declined,
|
||||
Microsoft.Graph.Models.ResponseType.TentativelyAccepted => AttendeeResponseStatus.Tentative,
|
||||
Microsoft.Graph.Models.ResponseType.None => AttendeeResponseStatus.NeedsAction,
|
||||
Microsoft.Graph.Models.ResponseType.NotResponded => AttendeeResponseStatus.NeedsAction,
|
||||
_ => AttendeeResponseStatus.NeedsAction
|
||||
};
|
||||
}
|
||||
|
||||
public static string ToRfc5545RecurrenceString(this PatternedRecurrence recurrence)
|
||||
{
|
||||
if (recurrence == null || recurrence.Pattern == null)
|
||||
throw new ArgumentNullException(nameof(recurrence), "PatternedRecurrence or its Pattern cannot be null.");
|
||||
|
||||
var ruleBuilder = new StringBuilder("RRULE:");
|
||||
var pattern = recurrence.Pattern;
|
||||
|
||||
// Frequency
|
||||
switch (pattern.Type)
|
||||
{
|
||||
case RecurrencePatternType.Daily:
|
||||
ruleBuilder.Append("FREQ=DAILY;");
|
||||
break;
|
||||
case RecurrencePatternType.Weekly:
|
||||
ruleBuilder.Append("FREQ=WEEKLY;");
|
||||
break;
|
||||
case RecurrencePatternType.AbsoluteMonthly:
|
||||
ruleBuilder.Append("FREQ=MONTHLY;");
|
||||
break;
|
||||
case RecurrencePatternType.AbsoluteYearly:
|
||||
ruleBuilder.Append("FREQ=YEARLY;");
|
||||
break;
|
||||
case RecurrencePatternType.RelativeMonthly:
|
||||
ruleBuilder.Append("FREQ=MONTHLY;");
|
||||
break;
|
||||
case RecurrencePatternType.RelativeYearly:
|
||||
ruleBuilder.Append("FREQ=YEARLY;");
|
||||
break;
|
||||
default:
|
||||
throw new NotSupportedException($"Unsupported recurrence pattern type: {pattern.Type}");
|
||||
}
|
||||
|
||||
// Interval
|
||||
if (pattern.Interval > 0)
|
||||
ruleBuilder.Append($"INTERVAL={pattern.Interval};");
|
||||
|
||||
// Days of Week
|
||||
if (pattern.DaysOfWeek?.Any() == true)
|
||||
{
|
||||
var days = string.Join(",", pattern.DaysOfWeek.Select(day => day.ToString().ToUpperInvariant().Substring(0, 2)));
|
||||
ruleBuilder.Append($"BYDAY={days};");
|
||||
}
|
||||
|
||||
// Day of Month (BYMONTHDAY)
|
||||
if (pattern.Type == RecurrencePatternType.AbsoluteMonthly || pattern.Type == RecurrencePatternType.AbsoluteYearly)
|
||||
{
|
||||
if (pattern.DayOfMonth <= 0)
|
||||
throw new ArgumentException("DayOfMonth must be greater than 0 for absoluteMonthly or absoluteYearly patterns.");
|
||||
|
||||
ruleBuilder.Append($"BYMONTHDAY={pattern.DayOfMonth};");
|
||||
}
|
||||
|
||||
// Month (BYMONTH)
|
||||
if (pattern.Type == RecurrencePatternType.AbsoluteYearly || pattern.Type == RecurrencePatternType.RelativeYearly)
|
||||
{
|
||||
if (pattern.Month <= 0)
|
||||
throw new ArgumentException("Month must be greater than 0 for absoluteYearly or relativeYearly patterns.");
|
||||
|
||||
ruleBuilder.Append($"BYMONTH={pattern.Month};");
|
||||
}
|
||||
|
||||
// Count or Until
|
||||
if (recurrence.Range != null)
|
||||
{
|
||||
if (recurrence.Range.Type == RecurrenceRangeType.EndDate && recurrence.Range.EndDate != null)
|
||||
{
|
||||
ruleBuilder.Append($"UNTIL={recurrence.Range.EndDate.Value:yyyyMMddTHHmmssZ};");
|
||||
}
|
||||
else if (recurrence.Range.Type == RecurrenceRangeType.Numbered && recurrence.Range.NumberOfOccurrences.HasValue)
|
||||
{
|
||||
ruleBuilder.Append($"COUNT={recurrence.Range.NumberOfOccurrences.Value};");
|
||||
}
|
||||
}
|
||||
|
||||
// Remove trailing semicolon
|
||||
return ruleBuilder.ToString().TrimEnd(';');
|
||||
}
|
||||
|
||||
public static DateTimeOffset GetDateTimeOffsetFromDateTimeTimeZone(DateTimeTimeZone dateTimeTimeZone)
|
||||
{
|
||||
if (dateTimeTimeZone == null || string.IsNullOrEmpty(dateTimeTimeZone.DateTime) || string.IsNullOrEmpty(dateTimeTimeZone.TimeZone))
|
||||
{
|
||||
throw new ArgumentException("DateTimeTimeZone is null or empty.");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Parse the DateTime string
|
||||
if (DateTime.TryParse(dateTimeTimeZone.DateTime, out DateTime parsedDateTime))
|
||||
{
|
||||
// Get TimeZoneInfo to get the offset
|
||||
TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(dateTimeTimeZone.TimeZone);
|
||||
TimeSpan offset = timeZoneInfo.GetUtcOffset(parsedDateTime);
|
||||
return new DateTimeOffset(parsedDateTime, offset);
|
||||
}
|
||||
else
|
||||
throw new ArgumentException("DateTime string is not in a valid format.");
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private static AttendeeStatus GetAttendeeStatus(ResponseType? responseType)
|
||||
{
|
||||
@@ -261,24 +161,6 @@ public static class OutlookIntegratorExtensions
|
||||
};
|
||||
}
|
||||
|
||||
public static CalendarEventAttendee CreateAttendee(this Attendee attendee, Guid calendarItemId)
|
||||
{
|
||||
bool isOrganizer = attendee?.Status?.Response == ResponseType.Organizer;
|
||||
|
||||
var eventAttendee = new CalendarEventAttendee()
|
||||
{
|
||||
CalendarItemId = calendarItemId,
|
||||
Id = Guid.NewGuid(),
|
||||
Email = attendee.EmailAddress?.Address,
|
||||
Name = attendee.EmailAddress?.Name,
|
||||
AttendenceStatus = GetAttendeeStatus(attendee.Status.Response),
|
||||
IsOrganizer = isOrganizer,
|
||||
IsOptionalAttendee = attendee.Type == AttendeeType.Optional,
|
||||
};
|
||||
|
||||
return eventAttendee;
|
||||
}
|
||||
|
||||
#region Mime to Outlook Message Helpers
|
||||
|
||||
private static IEnumerable<Recipient> GetRecipients(this InternetAddressList internetAddresses)
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Wino.Core.Integration.Processors;
|
||||
/// <see cref="IGmailChangeProcessor"/>, <see cref="IOutlookChangeProcessor"/> and <see cref="IImapChangeProcessor"/>
|
||||
/// None of the synchronizers can directly change anything in the database.
|
||||
/// </summary>
|
||||
public interface IDefaultChangeProcessor
|
||||
public interface IDefaultChangeProcessor : ICalendarServiceEx
|
||||
{
|
||||
Task UpdateAccountAsync(MailAccount account);
|
||||
// Task<string> UpdateAccountDeltaSynchronizationIdentifierAsync(Guid accountId, string deltaSynchronizationIdentifier);
|
||||
@@ -113,13 +113,14 @@ public class DefaultChangeProcessor(IDatabaseService databaseService,
|
||||
IMailService mailService,
|
||||
ICalendarService calendarService,
|
||||
IAccountService accountService,
|
||||
IMimeFileService mimeFileService) : BaseDatabaseService(databaseService), IDefaultChangeProcessor
|
||||
ICalendarServiceEx calendarServiceEx,
|
||||
IMimeFileService mimeFileService) : BaseDatabaseService(databaseService), IDefaultChangeProcessor, ICalendarServiceEx
|
||||
{
|
||||
protected IMailService MailService = mailService;
|
||||
protected ICalendarService CalendarService = calendarService;
|
||||
protected IFolderService FolderService = folderService;
|
||||
protected IAccountService AccountService = accountService;
|
||||
|
||||
private readonly ICalendarServiceEx _calendarServiceEx = calendarServiceEx;
|
||||
private readonly IMimeFileService _mimeFileService = mimeFileService;
|
||||
|
||||
public Task<string> UpdateAccountDeltaSynchronizationIdentifierAsync(Guid accountId, string synchronizationDeltaIdentifier)
|
||||
@@ -208,4 +209,234 @@ public class DefaultChangeProcessor(IDatabaseService databaseService,
|
||||
|
||||
public Task<bool> IsMailExistsInFolderAsync(string messageId, Guid folderId)
|
||||
=> MailService.IsMailExistsAsync(messageId, folderId);
|
||||
|
||||
// TODO: Normalize this shit. Not everything needs to be exposed for processor.
|
||||
#region ICalendarServiceEx
|
||||
|
||||
public Task<int> ClearAllCalendarEventAttendeesAsync()
|
||||
{
|
||||
return _calendarServiceEx.ClearAllCalendarEventAttendeesAsync();
|
||||
}
|
||||
|
||||
public Task<int> ClearAllCalendarsAsync()
|
||||
{
|
||||
return _calendarServiceEx.ClearAllCalendarsAsync();
|
||||
}
|
||||
|
||||
public Task<int> ClearAllDataAsync()
|
||||
{
|
||||
return _calendarServiceEx.ClearAllDataAsync();
|
||||
}
|
||||
|
||||
public Task<int> ClearAllEventsAsync()
|
||||
{
|
||||
return _calendarServiceEx.ClearAllEventsAsync();
|
||||
}
|
||||
|
||||
public Task<int> DeleteCalendarAsync(string remoteCalendarId)
|
||||
{
|
||||
return _calendarServiceEx.DeleteCalendarAsync(remoteCalendarId);
|
||||
}
|
||||
|
||||
public Task<int> DeleteCalendarEventAttendeesForEventAsync(Guid eventId)
|
||||
{
|
||||
return _calendarServiceEx.DeleteCalendarEventAttendeesForEventAsync(eventId);
|
||||
}
|
||||
|
||||
public Task<int> DeleteEventAsync(string remoteEventId)
|
||||
{
|
||||
return _calendarServiceEx.DeleteEventAsync(remoteEventId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarEventAttendee>> GetAllCalendarEventAttendeesAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllCalendarEventAttendeesAsync();
|
||||
}
|
||||
|
||||
public Task<List<AccountCalendar>> GetAllCalendarsAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllCalendarsAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetAllDayEventsAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllDayEventsAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetAllEventsAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllEventsAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetAllEventsIncludingDeletedAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllEventsIncludingDeletedAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetAllRecurringEventsByTypeAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetAllRecurringEventsByTypeAsync();
|
||||
}
|
||||
|
||||
public Task<AccountCalendar> GetCalendarByRemoteIdAsync(string remoteCalendarId)
|
||||
{
|
||||
return _calendarServiceEx.GetCalendarByRemoteIdAsync(remoteCalendarId);
|
||||
}
|
||||
|
||||
public Task<Dictionary<AttendeeResponseStatus, int>> GetCalendarEventAttendeeResponseCountsAsync(Guid eventId)
|
||||
{
|
||||
return _calendarServiceEx.GetCalendarEventAttendeeResponseCountsAsync(eventId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarEventAttendee>> GetCalendarEventAttendeesForEventAsync(Guid eventId)
|
||||
{
|
||||
return _calendarServiceEx.GetCalendarEventAttendeesForEventAsync(eventId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarEventAttendee>> GetCalendarEventAttendeesForEventByRemoteIdAsync(string remoteEventId)
|
||||
{
|
||||
return _calendarServiceEx.GetCalendarEventAttendeesForEventByRemoteIdAsync(remoteEventId);
|
||||
}
|
||||
|
||||
public Task<string> GetCalendarSyncTokenAsync(string calendarId)
|
||||
{
|
||||
return _calendarServiceEx.GetCalendarSyncTokenAsync(calendarId);
|
||||
}
|
||||
|
||||
public Task<CalendarItem> GetEventByRemoteIdAsync(string remoteEventId)
|
||||
{
|
||||
return _calendarServiceEx.GetEventByRemoteIdAsync(remoteEventId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsByItemTypeAsync(CalendarItemType itemType)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsByItemTypeAsync(itemType);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsByItemTypesAsync(params CalendarItemType[] itemTypes)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsByItemTypesAsync(itemTypes);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsByremoteCalendarIdAsync(string remoteCalendarId)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsByremoteCalendarIdAsync(remoteCalendarId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsForCalendarAsync(Guid calendarId)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsForCalendarAsync(calendarId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsInDateRangeAsync(DateTime startDate, DateTime endDate)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsInDateRangeAsync(startDate, endDate);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetEventsSinceLastSyncAsync(DateTime? lastSyncTime)
|
||||
{
|
||||
return _calendarServiceEx.GetEventsSinceLastSyncAsync(lastSyncTime);
|
||||
}
|
||||
|
||||
public Task<Dictionary<CalendarItemType, int>> GetEventStatsByItemTypeAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetEventStatsByItemTypeAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetExpandedEventsInDateRangeAsync(DateTime startDate, DateTime endDate)
|
||||
{
|
||||
return _calendarServiceEx.GetExpandedEventsInDateRangeAsync(startDate, endDate);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetExpandedEventsInDateRangeWithExceptionsAsync(DateTime startDate, DateTime endDate, AccountCalendar calendar)
|
||||
{
|
||||
return _calendarServiceEx.GetExpandedEventsInDateRangeWithExceptionsAsync(startDate, endDate, calendar);
|
||||
}
|
||||
|
||||
public Task<DateTime?> GetLastSyncTimeAsync(string calendarId)
|
||||
{
|
||||
return _calendarServiceEx.GetLastSyncTimeAsync(calendarId);
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetMultiDayEventsAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetMultiDayEventsAsync();
|
||||
}
|
||||
|
||||
public Task<List<CalendarItem>> GetRecurringEventsAsync()
|
||||
{
|
||||
return _calendarServiceEx.GetRecurringEventsAsync();
|
||||
}
|
||||
|
||||
public Task<int> HardDeleteEventAsync(string remoteEventId)
|
||||
{
|
||||
return _calendarServiceEx.HardDeleteEventAsync(remoteEventId);
|
||||
}
|
||||
|
||||
public Task<int> InsertCalendarAsync(AccountCalendar calendar)
|
||||
{
|
||||
return _calendarServiceEx.InsertCalendarAsync(calendar);
|
||||
}
|
||||
|
||||
public Task<int> InsertCalendarEventAttendeeAsync(CalendarEventAttendee calendareventattendee)
|
||||
{
|
||||
return _calendarServiceEx.InsertCalendarEventAttendeeAsync(calendareventattendee);
|
||||
}
|
||||
|
||||
public Task<int> InsertEventAsync(CalendarItem calendarItem)
|
||||
{
|
||||
return _calendarServiceEx.InsertEventAsync(calendarItem);
|
||||
}
|
||||
|
||||
public Task<int> MarkEventAsDeletedAsync(string remoteEventId, string remoteCalendarId)
|
||||
{
|
||||
return _calendarServiceEx.MarkEventAsDeletedAsync(remoteEventId, remoteCalendarId);
|
||||
}
|
||||
|
||||
public Task<int> SyncCalendarEventAttendeesForEventAsync(Guid eventId, List<CalendarEventAttendee> calendareventattendees)
|
||||
{
|
||||
return _calendarServiceEx.SyncCalendarEventAttendeesForEventAsync(eventId, calendareventattendees);
|
||||
}
|
||||
|
||||
public Task<int> UpdateAllEventItemTypesAsync()
|
||||
{
|
||||
return _calendarServiceEx.UpdateAllEventItemTypesAsync();
|
||||
}
|
||||
|
||||
public Task<int> UpdateCalendarAsync(AccountCalendar calendar)
|
||||
{
|
||||
return _calendarServiceEx.UpdateCalendarAsync(calendar);
|
||||
}
|
||||
|
||||
public Task<int> UpdateCalendarEventAttendeeAsync(CalendarEventAttendee calendareventattendee)
|
||||
{
|
||||
return _calendarServiceEx.UpdateCalendarEventAttendeeAsync(calendareventattendee);
|
||||
}
|
||||
|
||||
public Task<int> UpdateCalendarSyncTokenAsync(string calendarId, string syncToken)
|
||||
{
|
||||
return _calendarServiceEx.UpdateCalendarSyncTokenAsync(calendarId, syncToken);
|
||||
}
|
||||
|
||||
public Task<int> UpdateEventAsync(CalendarItem calendarItem)
|
||||
{
|
||||
return _calendarServiceEx.UpdateEventAsync(calendarItem);
|
||||
}
|
||||
|
||||
public Task<int> UpsertCalendarAsync(AccountCalendar calendar)
|
||||
{
|
||||
return _calendarServiceEx.UpsertCalendarAsync(calendar);
|
||||
}
|
||||
|
||||
public Task<int> UpsertEventAsync(CalendarItem calendarItem)
|
||||
{
|
||||
return _calendarServiceEx.UpsertEventAsync(calendarItem);
|
||||
}
|
||||
|
||||
public Task<int> SyncAttendeesForEventAsync(Guid eventId, List<CalendarEventAttendee> attendees)
|
||||
{
|
||||
return _calendarServiceEx.SyncAttendeesForEventAsync(eventId, attendees);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using Google.Apis.Calendar.v3.Data;
|
||||
using Serilog;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Entities.Shared;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Core.Domain.Models.MailItem;
|
||||
using Wino.Core.Extensions;
|
||||
using Wino.Services;
|
||||
using CalendarEventAttendee = Wino.Core.Domain.Entities.Calendar.CalendarEventAttendee;
|
||||
using CalendarItem = Wino.Core.Domain.Entities.Calendar.CalendarItem;
|
||||
|
||||
namespace Wino.Core.Integration.Processors;
|
||||
|
||||
@@ -23,7 +18,8 @@ public class GmailChangeProcessor : DefaultChangeProcessor, IGmailChangeProcesso
|
||||
IMailService mailService,
|
||||
ICalendarService calendarService,
|
||||
IAccountService accountService,
|
||||
IMimeFileService mimeFileService) : base(databaseService, folderService, mailService, calendarService, accountService, mimeFileService)
|
||||
ICalendarServiceEx calendarServiceEx,
|
||||
IMimeFileService mimeFileService) : base(databaseService, folderService, mailService, calendarService, accountService, calendarServiceEx, mimeFileService)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -36,224 +32,7 @@ public class GmailChangeProcessor : DefaultChangeProcessor, IGmailChangeProcesso
|
||||
|
||||
public async Task ManageCalendarEventAsync(Event calendarEvent, AccountCalendar assignedCalendar, MailAccount organizerAccount)
|
||||
{
|
||||
var status = calendarEvent.Status;
|
||||
|
||||
var recurringEventId = calendarEvent.RecurringEventId;
|
||||
|
||||
// 1. Canceled exceptions of recurred events are only guaranteed to have recurringEventId, Id and start time.
|
||||
// 2. Updated exceptions of recurred events have different Id, but recurringEventId is the same as parent.
|
||||
|
||||
// Check if we have this event before.
|
||||
var existingCalendarItem = await CalendarService.GetCalendarItemAsync(assignedCalendar.Id, calendarEvent.Id);
|
||||
|
||||
if (existingCalendarItem == null)
|
||||
{
|
||||
CalendarItem parentRecurringEvent = null;
|
||||
|
||||
// Manage the recurring event id.
|
||||
if (!string.IsNullOrEmpty(recurringEventId))
|
||||
{
|
||||
parentRecurringEvent = await CalendarService.GetCalendarItemAsync(assignedCalendar.Id, recurringEventId).ConfigureAwait(false);
|
||||
|
||||
if (parentRecurringEvent == null)
|
||||
{
|
||||
Log.Information($"Parent recurring event is missing for event. Skipping creation of {calendarEvent.Id}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// We don't have this event yet. Create a new one.
|
||||
var eventStartDateTimeOffset = GoogleIntegratorExtensions.GetEventDateTimeOffset(calendarEvent.Start);
|
||||
var eventEndDateTimeOffset = GoogleIntegratorExtensions.GetEventDateTimeOffset(calendarEvent.End);
|
||||
|
||||
double totalDurationInSeconds = 0;
|
||||
|
||||
if (eventStartDateTimeOffset != null && eventEndDateTimeOffset != null)
|
||||
{
|
||||
totalDurationInSeconds = (eventEndDateTimeOffset.Value - eventStartDateTimeOffset.Value).TotalSeconds;
|
||||
}
|
||||
|
||||
CalendarItem calendarItem = null;
|
||||
|
||||
if (parentRecurringEvent != null)
|
||||
{
|
||||
// Exceptions of parent events might not have all the fields populated.
|
||||
// We must use the parent event's data for fields that don't exists.
|
||||
|
||||
// Update duration if it's not populated.
|
||||
if (totalDurationInSeconds == 0)
|
||||
{
|
||||
totalDurationInSeconds = parentRecurringEvent.DurationInSeconds;
|
||||
}
|
||||
|
||||
var organizerMail = GetOrganizerEmail(calendarEvent, organizerAccount);
|
||||
var organizerName = GetOrganizerName(calendarEvent, organizerAccount);
|
||||
|
||||
|
||||
calendarItem = new CalendarItem()
|
||||
{
|
||||
CalendarId = assignedCalendar.Id,
|
||||
CreatedAt = DateTimeOffset.UtcNow,
|
||||
Description = calendarEvent.Description ?? parentRecurringEvent.Description,
|
||||
Id = Guid.NewGuid(),
|
||||
StartDate = eventStartDateTimeOffset.Value.DateTime,
|
||||
StartDateOffset = eventStartDateTimeOffset.Value.Offset,
|
||||
EndDateOffset = eventEndDateTimeOffset?.Offset ?? parentRecurringEvent.EndDateOffset,
|
||||
DurationInSeconds = totalDurationInSeconds,
|
||||
Location = string.IsNullOrEmpty(calendarEvent.Location) ? parentRecurringEvent.Location : calendarEvent.Location,
|
||||
|
||||
// Leave it empty if it's not populated.
|
||||
Recurrence = GoogleIntegratorExtensions.GetRecurrenceString(calendarEvent) == null ? string.Empty : GoogleIntegratorExtensions.GetRecurrenceString(calendarEvent),
|
||||
Status = GetStatus(calendarEvent.Status),
|
||||
Title = string.IsNullOrEmpty(calendarEvent.Summary) ? parentRecurringEvent.Title : calendarEvent.Summary,
|
||||
UpdatedAt = DateTimeOffset.UtcNow,
|
||||
Visibility = string.IsNullOrEmpty(calendarEvent.Visibility) ? parentRecurringEvent.Visibility : GetVisibility(calendarEvent.Visibility),
|
||||
HtmlLink = string.IsNullOrEmpty(calendarEvent.HtmlLink) ? parentRecurringEvent.HtmlLink : calendarEvent.HtmlLink,
|
||||
RemoteEventId = calendarEvent.Id,
|
||||
IsLocked = calendarEvent.Locked.GetValueOrDefault(),
|
||||
OrganizerDisplayName = string.IsNullOrEmpty(organizerName) ? parentRecurringEvent.OrganizerDisplayName : organizerName,
|
||||
OrganizerEmail = string.IsNullOrEmpty(organizerMail) ? parentRecurringEvent.OrganizerEmail : organizerMail
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is a parent event creation.
|
||||
// Start-End dates are guaranteed to be populated.
|
||||
|
||||
if (eventStartDateTimeOffset == null || eventEndDateTimeOffset == null)
|
||||
{
|
||||
Log.Error("Failed to create parent event because either start or end date is not specified.");
|
||||
return;
|
||||
}
|
||||
|
||||
calendarItem = new CalendarItem()
|
||||
{
|
||||
CalendarId = assignedCalendar.Id,
|
||||
CreatedAt = DateTimeOffset.UtcNow,
|
||||
Description = calendarEvent.Description,
|
||||
Id = Guid.NewGuid(),
|
||||
StartDate = eventStartDateTimeOffset.Value.DateTime,
|
||||
StartDateOffset = eventStartDateTimeOffset.Value.Offset,
|
||||
EndDateOffset = eventEndDateTimeOffset.Value.Offset,
|
||||
DurationInSeconds = totalDurationInSeconds,
|
||||
Location = calendarEvent.Location,
|
||||
Recurrence = GoogleIntegratorExtensions.GetRecurrenceString(calendarEvent),
|
||||
Status = GetStatus(calendarEvent.Status),
|
||||
Title = calendarEvent.Summary,
|
||||
UpdatedAt = DateTimeOffset.UtcNow,
|
||||
Visibility = GetVisibility(calendarEvent.Visibility),
|
||||
HtmlLink = calendarEvent.HtmlLink,
|
||||
RemoteEventId = calendarEvent.Id,
|
||||
IsLocked = calendarEvent.Locked.GetValueOrDefault(),
|
||||
OrganizerDisplayName = GetOrganizerName(calendarEvent, organizerAccount),
|
||||
OrganizerEmail = GetOrganizerEmail(calendarEvent, organizerAccount)
|
||||
};
|
||||
}
|
||||
|
||||
// Hide canceled events.
|
||||
calendarItem.IsHidden = calendarItem.Status == CalendarItemStatus.Cancelled;
|
||||
|
||||
// Manage the recurring event id.
|
||||
if (parentRecurringEvent != null)
|
||||
{
|
||||
calendarItem.RecurringCalendarItemId = parentRecurringEvent.Id;
|
||||
}
|
||||
|
||||
Debug.WriteLine($"({assignedCalendar.Name}) {calendarItem.Title}, Start: {calendarItem.StartDate.ToString("f")}, End: {calendarItem.EndDate.ToString("f")}");
|
||||
|
||||
// Attendees
|
||||
var attendees = new List<CalendarEventAttendee>();
|
||||
|
||||
if (calendarEvent.Attendees == null)
|
||||
{
|
||||
// Self-only event.
|
||||
|
||||
attendees.Add(new CalendarEventAttendee()
|
||||
{
|
||||
CalendarItemId = calendarItem.Id,
|
||||
IsOrganizer = true,
|
||||
Email = organizerAccount.Address,
|
||||
Name = organizerAccount.SenderName,
|
||||
AttendenceStatus = AttendeeStatus.Accepted,
|
||||
Id = Guid.NewGuid(),
|
||||
IsOptionalAttendee = false,
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var attendee in calendarEvent.Attendees)
|
||||
{
|
||||
if (attendee.Self == true)
|
||||
{
|
||||
// TODO:
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(attendee.Email))
|
||||
{
|
||||
AttendeeStatus GetAttendenceStatus(string responseStatus)
|
||||
{
|
||||
return responseStatus switch
|
||||
{
|
||||
"accepted" => AttendeeStatus.Accepted,
|
||||
"declined" => AttendeeStatus.Declined,
|
||||
"tentative" => AttendeeStatus.Tentative,
|
||||
"needsAction" => AttendeeStatus.NeedsAction,
|
||||
_ => AttendeeStatus.NeedsAction
|
||||
};
|
||||
}
|
||||
|
||||
var eventAttendee = new CalendarEventAttendee()
|
||||
{
|
||||
CalendarItemId = calendarItem.Id,
|
||||
IsOrganizer = attendee.Organizer ?? false,
|
||||
Comment = attendee.Comment,
|
||||
Email = attendee.Email,
|
||||
Name = attendee.DisplayName,
|
||||
AttendenceStatus = GetAttendenceStatus(attendee.ResponseStatus),
|
||||
Id = Guid.NewGuid(),
|
||||
IsOptionalAttendee = attendee.Optional ?? false,
|
||||
};
|
||||
|
||||
attendees.Add(eventAttendee);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await CalendarService.CreateNewCalendarItemAsync(calendarItem, attendees);
|
||||
}
|
||||
else
|
||||
{
|
||||
// We have this event already. Update it.
|
||||
if (calendarEvent.Status == "cancelled")
|
||||
{
|
||||
// Parent event is canceled. We must delete everything.
|
||||
if (string.IsNullOrEmpty(recurringEventId))
|
||||
{
|
||||
Log.Information("Parent event is canceled. Deleting all instances of {Id}", existingCalendarItem.Id);
|
||||
|
||||
await CalendarService.DeleteCalendarItemAsync(existingCalendarItem.Id).ConfigureAwait(false);
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Child event is canceled.
|
||||
// Child should live as long as parent lives, but must not be displayed to the user.
|
||||
|
||||
existingCalendarItem.IsHidden = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Make sure to unhide the event.
|
||||
// It might be marked as hidden before.
|
||||
existingCalendarItem.IsHidden = false;
|
||||
|
||||
// Update the event properties.
|
||||
}
|
||||
}
|
||||
|
||||
// Upsert the event.
|
||||
await Connection.InsertOrReplaceAsync(existingCalendarItem);
|
||||
// TODO:
|
||||
}
|
||||
|
||||
private string GetOrganizerName(Event calendarEvent, MailAccount account)
|
||||
|
||||
@@ -13,7 +13,8 @@ public class ImapChangeProcessor : DefaultChangeProcessor, IImapChangeProcessor
|
||||
IMailService mailService,
|
||||
IAccountService accountService,
|
||||
ICalendarService calendarService,
|
||||
IMimeFileService mimeFileService) : base(databaseService, folderService, mailService, calendarService, accountService, mimeFileService)
|
||||
ICalendarServiceEx calendarServiceEx,
|
||||
IMimeFileService mimeFileService) : base(databaseService, folderService, mailService, calendarService, accountService, calendarServiceEx, mimeFileService)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Graph.Models;
|
||||
using Serilog;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Entities.Shared;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Core.Extensions;
|
||||
using Wino.Services;
|
||||
|
||||
namespace Wino.Core.Integration.Processors;
|
||||
@@ -17,7 +13,8 @@ public class OutlookChangeProcessor(IDatabaseService databaseService,
|
||||
ICalendarService calendarService,
|
||||
IMailService mailService,
|
||||
IAccountService accountService,
|
||||
IMimeFileService mimeFileService) : DefaultChangeProcessor(databaseService, folderService, mailService, calendarService, accountService, mimeFileService)
|
||||
ICalendarServiceEx calendarServiceEx,
|
||||
IMimeFileService mimeFileService) : DefaultChangeProcessor(databaseService, folderService, mailService, calendarService, accountService, calendarServiceEx, mimeFileService)
|
||||
, IOutlookChangeProcessor
|
||||
{
|
||||
|
||||
@@ -40,106 +37,6 @@ public class OutlookChangeProcessor(IDatabaseService databaseService,
|
||||
|
||||
public async Task ManageCalendarEventAsync(Event calendarEvent, AccountCalendar assignedCalendar, MailAccount organizerAccount)
|
||||
{
|
||||
// We parse the occurrences based on the parent event.
|
||||
// There is literally no point to store them because
|
||||
// type=Exception events are the exceptional childs of recurrency parent event.
|
||||
|
||||
if (calendarEvent.Type == EventType.Occurrence) return;
|
||||
|
||||
var savingItem = await CalendarService.GetCalendarItemAsync(assignedCalendar.Id, calendarEvent.Id);
|
||||
|
||||
Guid savingItemId = Guid.Empty;
|
||||
|
||||
if (savingItem != null)
|
||||
savingItemId = savingItem.Id;
|
||||
else
|
||||
{
|
||||
savingItemId = Guid.NewGuid();
|
||||
savingItem = new CalendarItem() { Id = savingItemId };
|
||||
}
|
||||
|
||||
DateTimeOffset eventStartDateTimeOffset = OutlookIntegratorExtensions.GetDateTimeOffsetFromDateTimeTimeZone(calendarEvent.Start);
|
||||
DateTimeOffset eventEndDateTimeOffset = OutlookIntegratorExtensions.GetDateTimeOffsetFromDateTimeTimeZone(calendarEvent.End);
|
||||
|
||||
var durationInSeconds = (eventEndDateTimeOffset - eventStartDateTimeOffset).TotalSeconds;
|
||||
|
||||
savingItem.RemoteEventId = calendarEvent.Id;
|
||||
savingItem.StartDate = eventStartDateTimeOffset.DateTime;
|
||||
savingItem.StartDateOffset = eventStartDateTimeOffset.Offset;
|
||||
savingItem.EndDateOffset = eventEndDateTimeOffset.Offset;
|
||||
savingItem.DurationInSeconds = durationInSeconds;
|
||||
|
||||
savingItem.Title = calendarEvent.Subject;
|
||||
savingItem.Description = calendarEvent.Body?.Content;
|
||||
savingItem.Location = calendarEvent.Location?.DisplayName;
|
||||
|
||||
if (calendarEvent.Type == EventType.Exception && !string.IsNullOrEmpty(calendarEvent.SeriesMasterId))
|
||||
{
|
||||
// This is a recurring event exception.
|
||||
// We need to find the parent event and set it as recurring event id.
|
||||
|
||||
var parentEvent = await CalendarService.GetCalendarItemAsync(assignedCalendar.Id, calendarEvent.SeriesMasterId);
|
||||
|
||||
if (parentEvent != null)
|
||||
{
|
||||
savingItem.RecurringCalendarItemId = parentEvent.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning($"Parent recurring event is missing for event. Skipping creation of {calendarEvent.Id}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert the recurrence pattern to string for parent recurring events.
|
||||
if (calendarEvent.Type == EventType.SeriesMaster && calendarEvent.Recurrence != null)
|
||||
{
|
||||
savingItem.Recurrence = OutlookIntegratorExtensions.ToRfc5545RecurrenceString(calendarEvent.Recurrence);
|
||||
}
|
||||
|
||||
savingItem.HtmlLink = calendarEvent.WebLink;
|
||||
savingItem.CalendarId = assignedCalendar.Id;
|
||||
savingItem.OrganizerEmail = calendarEvent.Organizer?.EmailAddress?.Address;
|
||||
savingItem.OrganizerDisplayName = calendarEvent.Organizer?.EmailAddress?.Name;
|
||||
savingItem.IsHidden = false;
|
||||
|
||||
if (calendarEvent.ResponseStatus?.Response != null)
|
||||
{
|
||||
switch (calendarEvent.ResponseStatus.Response.Value)
|
||||
{
|
||||
case ResponseType.None:
|
||||
case ResponseType.NotResponded:
|
||||
savingItem.Status = CalendarItemStatus.NotResponded;
|
||||
break;
|
||||
case ResponseType.TentativelyAccepted:
|
||||
savingItem.Status = CalendarItemStatus.Tentative;
|
||||
break;
|
||||
case ResponseType.Accepted:
|
||||
case ResponseType.Organizer:
|
||||
savingItem.Status = CalendarItemStatus.Confirmed;
|
||||
break;
|
||||
case ResponseType.Declined:
|
||||
savingItem.Status = CalendarItemStatus.Cancelled;
|
||||
savingItem.IsHidden = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
savingItem.Status = CalendarItemStatus.Confirmed;
|
||||
}
|
||||
|
||||
// Upsert the event.
|
||||
await Connection.InsertOrReplaceAsync(savingItem);
|
||||
|
||||
// Manage attendees.
|
||||
if (calendarEvent.Attendees != null)
|
||||
{
|
||||
// Clear all attendees for this event.
|
||||
var attendees = calendarEvent.Attendees.Select(a => a.CreateAttendee(savingItemId)).ToList();
|
||||
await CalendarService.ManageEventAttendeesAsync(savingItemId, attendees).ConfigureAwait(false);
|
||||
}
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
@@ -361,75 +361,207 @@ public class GmailSynchronizer : WinoSynchronizer<IClientServiceRequest, Message
|
||||
|
||||
await SynchronizeCalendarsAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
bool isInitialSync = string.IsNullOrEmpty(Account.SynchronizationDeltaIdentifier);
|
||||
|
||||
_logger.Debug("Is initial synchronization: {IsInitialSync}", isInitialSync);
|
||||
|
||||
var localCalendars = await _gmailChangeProcessor.GetAccountCalendarsAsync(Account.Id).ConfigureAwait(false);
|
||||
|
||||
// TODO: Better logging and exception handling.
|
||||
foreach (var calendar in localCalendars)
|
||||
{
|
||||
var request = _calendarService.Events.List(calendar.RemoteCalendarId);
|
||||
// We can do just delta sync. It will fallback to full sync if there are no sync tokens or if the token is expired.
|
||||
await DeltaSynchronizeCalendarAsync(calendar).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
request.SingleEvents = false;
|
||||
request.ShowDeleted = true;
|
||||
// TODO: Return proper result from delta or full sync.
|
||||
return new CalendarSynchronizationResult()
|
||||
{
|
||||
CompletedState = SynchronizationCompletedState.Success,
|
||||
DownloadedEvents = new List<ICalendarItem>(),
|
||||
};
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(calendar.SynchronizationDeltaToken))
|
||||
private async Task FullSynchronizeCalendarAsync(AccountCalendar calendar)
|
||||
{
|
||||
var calendarId = calendar.RemoteCalendarId;
|
||||
|
||||
try
|
||||
{
|
||||
// Get events from the last 30 days to 1 year in the future
|
||||
var timeMin = DateTime.Now.AddYears(-3);
|
||||
var timeMax = DateTime.Now.AddYears(2);
|
||||
|
||||
var request = _calendarService.Events.List(calendarId);
|
||||
request.TimeMinDateTimeOffset = timeMin;
|
||||
request.TimeMaxDateTimeOffset = timeMax;
|
||||
request.SingleEvents = false; // Include recurring events
|
||||
request.ShowDeleted = true; // Include deleted events for synchronization
|
||||
request.MaxResults = 2500; // Maximum allowed by Google Calendar API
|
||||
|
||||
var events = await request.ExecuteAsync();
|
||||
|
||||
if (events.Items != null && events.Items.Count > 0)
|
||||
{
|
||||
// If a sync token is available, perform an incremental sync
|
||||
request.SyncToken = calendar.SynchronizationDeltaToken;
|
||||
Console.WriteLine($"Processing {events.Items.Count} events from calendar: {calendarId}");
|
||||
|
||||
foreach (var googleEvent in events.Items)
|
||||
{
|
||||
await ProcessGoogleEventAsync(googleEvent, calendar);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// If no sync token, perform an initial sync
|
||||
// Fetch events from the past year
|
||||
|
||||
request.TimeMinDateTimeOffset = DateTimeOffset.UtcNow.AddYears(-1);
|
||||
Console.WriteLine($"No events found in calendar: {calendarId}");
|
||||
}
|
||||
|
||||
string nextPageToken;
|
||||
string syncToken;
|
||||
|
||||
var allEvents = new List<Event>();
|
||||
|
||||
do
|
||||
// Store the sync token for future delta syncs
|
||||
if (!string.IsNullOrEmpty(events.NextSyncToken))
|
||||
{
|
||||
// Execute the request
|
||||
var events = await request.ExecuteAsync();
|
||||
await _gmailChangeProcessor.UpdateCalendarDeltaSynchronizationToken(calendar.Id, events.NextSyncToken).ConfigureAwait(false);
|
||||
|
||||
// Process the fetched events
|
||||
if (events.Items != null)
|
||||
{
|
||||
allEvents.AddRange(events.Items);
|
||||
}
|
||||
|
||||
// Get the next page token and sync token
|
||||
nextPageToken = events.NextPageToken;
|
||||
syncToken = events.NextSyncToken;
|
||||
|
||||
// Set the next page token for subsequent requests
|
||||
request.PageToken = nextPageToken;
|
||||
|
||||
} while (!string.IsNullOrEmpty(nextPageToken));
|
||||
|
||||
calendar.SynchronizationDeltaToken = syncToken;
|
||||
|
||||
// allEvents contains new or updated events.
|
||||
// Process them and create/update local calendar items.
|
||||
|
||||
foreach (var @event in allEvents)
|
||||
{
|
||||
// TODO: Exception handling for event processing.
|
||||
// TODO: Also update attendees and other properties.
|
||||
|
||||
await _gmailChangeProcessor.ManageCalendarEventAsync(@event, calendar, Account).ConfigureAwait(false);
|
||||
Console.WriteLine($"Stored sync token for calendar {calendarId} to enable delta sync");
|
||||
}
|
||||
|
||||
await _gmailChangeProcessor.UpdateAccountCalendarAsync(calendar).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new InvalidOperationException($"Failed to synchronize calendar {calendarId}: {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
return default;
|
||||
private async Task<bool> DeltaSynchronizeCalendarAsync(AccountCalendar calendar)
|
||||
{
|
||||
var calendarId = calendar.RemoteCalendarId;
|
||||
|
||||
try
|
||||
{
|
||||
Console.WriteLine($"Starting delta sync for calendar: {calendarId}");
|
||||
|
||||
// Get the stored sync token for this calendar
|
||||
var syncToken = calendar.SynchronizationDeltaToken;
|
||||
|
||||
if (string.IsNullOrEmpty(syncToken))
|
||||
{
|
||||
Console.WriteLine($"No sync token found for calendar {calendarId}. Performing full sync...");
|
||||
await FullSynchronizeCalendarAsync(calendar);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Create the events list request with sync token
|
||||
var request = _calendarService.Events.List(calendarId);
|
||||
request.SyncToken = syncToken;
|
||||
request.ShowDeleted = true; // Important: include deleted events for delta sync
|
||||
request.SingleEvents = false; // Include recurring events
|
||||
|
||||
Console.WriteLine($"Requesting delta changes with sync token: {syncToken.Substring(0, Math.Min(20, syncToken.Length))}...");
|
||||
|
||||
Events events;
|
||||
try
|
||||
{
|
||||
events = await request.ExecuteAsync();
|
||||
}
|
||||
catch (Google.GoogleApiException ex) when (ex.HttpStatusCode == System.Net.HttpStatusCode.Gone)
|
||||
{
|
||||
// Sync token has expired, need to do full sync
|
||||
Console.WriteLine($"Sync token expired for calendar {calendarId}. Performing full sync...");
|
||||
await FullSynchronizeCalendarAsync(calendar);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (events.Items != null && events.Items.Count > 0)
|
||||
{
|
||||
Console.WriteLine($"Processing {events.Items.Count} delta changes for calendar: {calendarId}");
|
||||
|
||||
foreach (var googleEvent in events.Items)
|
||||
{
|
||||
await ProcessDeltaCalendarEventAsync(googleEvent, calendar);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"No changes found for calendar: {calendarId}");
|
||||
}
|
||||
|
||||
// Store the new sync token
|
||||
if (!string.IsNullOrEmpty(events.NextSyncToken))
|
||||
{
|
||||
await _gmailChangeProcessor.UpdateCalendarSyncTokenAsync(calendarId, events.NextSyncToken).ConfigureAwait(false);
|
||||
|
||||
calendar.SynchronizationDeltaToken = events.NextSyncToken;
|
||||
Console.WriteLine($"Updated sync token for calendar {calendarId}");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error during delta sync for calendar {calendarId}: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes a single event change from delta synchronization
|
||||
/// </summary>
|
||||
/// <param name="googleEvent">The Google Calendar event</param>
|
||||
/// <param name="calendarId">The ID of the calendar containing the event</param>
|
||||
private async Task ProcessDeltaCalendarEventAsync(Event googleEvent, AccountCalendar calendar)
|
||||
{
|
||||
var calendarId = calendar.RemoteCalendarId;
|
||||
|
||||
try
|
||||
{
|
||||
if (googleEvent.Status == "cancelled")
|
||||
{
|
||||
// Handle deleted/canceled events
|
||||
await _gmailChangeProcessor.MarkEventAsDeletedAsync(googleEvent.Id, calendarId);
|
||||
Console.WriteLine($"🗑️ Marked event as deleted: {googleEvent.Summary ?? googleEvent.Id}");
|
||||
return;
|
||||
}
|
||||
|
||||
// For active events (confirmed, tentative), process normally
|
||||
var calendarEvent = GoogleIntegratorExtensions.MapGoogleEventToCalendarEvent(googleEvent, calendar);
|
||||
var result = await _gmailChangeProcessor.UpsertEventAsync(calendarEvent);
|
||||
|
||||
// Sync attendees for delta events too
|
||||
await SyncEventAttendeesAsync(googleEvent, calendarEvent.Id);
|
||||
|
||||
if (result > 0)
|
||||
{
|
||||
var action = await _gmailChangeProcessor.GetEventByRemoteIdAsync(googleEvent.Id) != null ? "Updated" : "Created";
|
||||
Console.WriteLine($"✅ {action} event: {calendarEvent.Title} ({calendarEvent.RemoteEventId})");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"❌ Failed to process delta event {googleEvent.Id}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes a single Google Calendar event and updates the local database
|
||||
/// </summary>
|
||||
/// <param name="googleEvent">The Google Calendar event</param>
|
||||
/// <param name="calendarId">The ID of the calendar containing the event</param>
|
||||
private async Task ProcessGoogleEventAsync(Event googleEvent, AccountCalendar calendar)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (googleEvent.Status == "cancelled")
|
||||
{
|
||||
// Handle deleted events
|
||||
await _gmailChangeProcessor.DeleteEventAsync(googleEvent.Id);
|
||||
Console.WriteLine($"Marked event as deleted: {googleEvent.Summary ?? googleEvent.Id}");
|
||||
return;
|
||||
}
|
||||
|
||||
var calendarEvent = googleEvent.MapGoogleEventToCalendarEvent(calendar);
|
||||
await _gmailChangeProcessor.UpsertEventAsync(calendarEvent);
|
||||
|
||||
// Sync attendees separately
|
||||
await SyncEventAttendeesAsync(googleEvent, calendarEvent.Id);
|
||||
|
||||
Console.WriteLine($"Processed event: {calendarEvent.Title} ({calendarEvent.RemoteEventId})");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Failed to process event {googleEvent.Id}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SynchronizeCalendarsAsync(CancellationToken cancellationToken = default)
|
||||
@@ -511,6 +643,40 @@ public class GmailSynchronizer : WinoSynchronizer<IClientServiceRequest, Message
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Syncs attendees for an event from Google Calendar data
|
||||
/// </summary>
|
||||
/// <param name="googleEvent">The Google Calendar event</param>
|
||||
/// <param name="eventId">The internal event Guid</param>
|
||||
private async Task SyncEventAttendeesAsync(Event googleEvent, Guid eventId)
|
||||
{
|
||||
var attendees = new List<CalendarEventAttendee>();
|
||||
|
||||
if (googleEvent.Attendees != null && googleEvent.Attendees.Count > 0)
|
||||
{
|
||||
foreach (var googleAttendee in googleEvent.Attendees)
|
||||
{
|
||||
var attendee = new CalendarEventAttendee
|
||||
{
|
||||
EventId = eventId,
|
||||
Email = googleAttendee.Email ?? string.Empty,
|
||||
DisplayName = googleAttendee.DisplayName,
|
||||
ResponseStatus = GoogleIntegratorExtensions.FromGoogleStatus(googleAttendee.ResponseStatus),
|
||||
IsOptional = googleAttendee.Optional ?? false,
|
||||
IsOrganizer = googleAttendee.Organizer ?? false,
|
||||
IsSelf = googleAttendee.Self ?? false,
|
||||
Comment = googleAttendee.Comment,
|
||||
AdditionalGuests = googleAttendee.AdditionalGuests
|
||||
};
|
||||
|
||||
attendees.Add(attendee);
|
||||
}
|
||||
}
|
||||
|
||||
// Sync attendees (replaces existing)
|
||||
await _gmailChangeProcessor.SyncAttendeesForEventAsync(eventId, attendees).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private async Task InitializeArchiveFolderAsync()
|
||||
{
|
||||
var localFolders = await _gmailChangeProcessor.GetLocalFoldersAsync(Account.Id).ConfigureAwait(false);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -26,7 +26,6 @@
|
||||
<PackageReference Include="morelinq" />
|
||||
<PackageReference Include="Nito.AsyncEx.Tasks" />
|
||||
<PackageReference Include="NodaTime" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="SkiaSharp" />
|
||||
<PackageReference Include="SqlKata" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" />
|
||||
|
||||
@@ -26,18 +26,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
|
||||
[NotifyPropertyChangedFor(nameof(IsStartupBehaviorEnabled))]
|
||||
private StartupBehaviorResult startupBehaviorResult;
|
||||
|
||||
private int _emailSyncIntervalMinutes;
|
||||
public int EmailSyncIntervalMinutes
|
||||
{
|
||||
get => _emailSyncIntervalMinutes;
|
||||
set
|
||||
{
|
||||
SetProperty(ref _emailSyncIntervalMinutes, value);
|
||||
|
||||
PreferencesService.EmailSyncIntervalMinutes = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsStartupBehaviorDisabled => !IsStartupBehaviorEnabled;
|
||||
public bool IsStartupBehaviorEnabled => StartupBehaviorResult == StartupBehaviorResult.Enabled;
|
||||
|
||||
@@ -96,7 +84,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel
|
||||
|
||||
SelectedAppTerminationBehavior = _appTerminationBehavior[(int)PreferencesService.ServerTerminationBehavior];
|
||||
SelectedDefaultSearchMode = SearchModes[(int)PreferencesService.DefaultSearchMode];
|
||||
EmailSyncIntervalMinutes = PreferencesService.EmailSyncIntervalMinutes;
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
|
||||
@@ -98,13 +98,19 @@ public partial class EditAccountDetailsPageViewModel : MailBaseViewModel
|
||||
Messenger.Send(new BackBreadcrumNavigationRequested());
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private Task SaveWithoutGoBackAsync()
|
||||
{
|
||||
return UpdateAccountAsync();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task ValidateImapSettingsAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
await _imapTestService.TestImapConnectionAsync(ServerInformation, true);
|
||||
_mailDialogService.InfoBarMessage(Translator.IMAPSetupDialog_ValidationSuccess_Title, Translator.IMAPSetupDialog_ValidationSuccess_Message, Core.Domain.Enums.InfoBarMessageType.Success);
|
||||
_mailDialogService.InfoBarMessage(Translator.IMAPSetupDialog_ValidationSuccess_Title, Translator.IMAPSetupDialog_ValidationSuccess_Message, Core.Domain.Enums.InfoBarMessageType.Success); ;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -112,9 +118,12 @@ public partial class EditAccountDetailsPageViewModel : MailBaseViewModel
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task UpdateCustomServerInformationAsync()
|
||||
private Task UpdateAccountAsync()
|
||||
{
|
||||
Account.Name = AccountName;
|
||||
Account.SenderName = SenderName;
|
||||
Account.AccountColorHex = SelectedColor == null ? string.Empty : SelectedColor.Hex;
|
||||
|
||||
if (ServerInformation != null)
|
||||
{
|
||||
ServerInformation.IncomingAuthenticationMethod = AvailableAuthenticationMethods[SelectedIncomingServerAuthenticationMethodIndex].ImapAuthenticationMethod;
|
||||
@@ -126,17 +135,6 @@ public partial class EditAccountDetailsPageViewModel : MailBaseViewModel
|
||||
Account.ServerInformation = ServerInformation;
|
||||
}
|
||||
|
||||
await _accountService.UpdateAccountCustomServerInformationAsync(Account.ServerInformation);
|
||||
|
||||
_mailDialogService.InfoBarMessage(Translator.IMAPSetupDialog_SaveImapSuccess_Title, Translator.IMAPSetupDialog_SaveImapSuccess_Message, Core.Domain.Enums.InfoBarMessageType.Success);
|
||||
}
|
||||
|
||||
private Task UpdateAccountAsync()
|
||||
{
|
||||
Account.Name = AccountName;
|
||||
Account.SenderName = SenderName;
|
||||
Account.AccountColorHex = SelectedColor == null ? string.Empty : SelectedColor.Hex;
|
||||
|
||||
return _accountService.UpdateAccountAsync(Account);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="EmailValidation" />
|
||||
<PackageReference Include="Microsoft.Identity.Client" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="System.Reactive" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:domain="using:Wino.Core.Domain"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<ScrollViewer>
|
||||
@@ -36,17 +35,6 @@
|
||||
<PathIcon Data="F1 M 18.75 18.125 C 18.75 18.294271 18.68815 18.440756 18.564453 18.564453 C 18.440754 18.68815 18.29427 18.75 18.125 18.75 C 17.955729 18.75 17.809244 18.68815 17.685547 18.564453 L 12.519531 13.398438 C 11.907552 13.912761 11.22233 14.308269 10.463867 14.584961 C 9.705403 14.861654 8.925781 15 8.125 15 C 7.493489 15 6.884765 14.91862 6.298828 14.755859 C 5.712891 14.5931 5.166016 14.361979 4.658203 14.0625 C 4.150391 13.763021 3.686523 13.40332 3.266602 12.983398 C 2.84668 12.563477 2.486979 12.099609 2.1875 11.591797 C 1.888021 11.083984 1.656901 10.537109 1.494141 9.951172 C 1.33138 9.365234 1.25 8.756511 1.25 8.125 C 1.25 7.49349 1.33138 6.884766 1.494141 6.298828 C 1.656901 5.712891 1.888021 5.166016 2.1875 4.658203 C 2.486979 4.150391 2.84668 3.686523 3.266602 3.266602 C 3.686523 2.84668 4.150391 2.48698 4.658203 2.1875 C 5.166016 1.888021 5.712891 1.656902 6.298828 1.494141 C 6.884765 1.331381 7.493489 1.25 8.125 1.25 C 8.75651 1.25 9.365234 1.331381 9.951172 1.494141 C 10.537109 1.656902 11.083984 1.888021 11.591797 2.1875 C 12.099609 2.48698 12.563477 2.84668 12.983398 3.266602 C 13.40332 3.686523 13.763021 4.150391 14.0625 4.658203 C 14.361979 5.166016 14.593099 5.712891 14.755859 6.298828 C 14.918619 6.884766 14.999999 7.49349 15 8.125 C 14.999999 8.925781 14.861652 9.705404 14.584961 10.463867 C 14.308268 11.222331 13.91276 11.907553 13.398438 12.519531 L 18.564453 17.685547 C 18.68815 17.809244 18.75 17.955729 18.75 18.125 Z M 13.75 8.125 C 13.75 7.610678 13.683268 7.114258 13.549805 6.635742 C 13.416341 6.157227 13.227539 5.709636 12.983398 5.292969 C 12.739258 4.876303 12.444661 4.495443 12.099609 4.150391 C 11.754557 3.80534 11.373697 3.510742 10.957031 3.266602 C 10.540364 3.022461 10.092773 2.83366 9.614258 2.700195 C 9.135742 2.566732 8.639322 2.5 8.125 2.5 C 7.35026 2.5 6.621094 2.648113 5.9375 2.944336 C 5.253906 3.240561 4.658203 3.642578 4.150391 4.150391 C 3.642578 4.658204 3.24056 5.253907 2.944336 5.9375 C 2.648112 6.621095 2.5 7.350262 2.5 8.125 C 2.5 8.90625 2.646484 9.638672 2.939453 10.322266 C 3.232422 11.005859 3.632812 11.601562 4.140625 12.109375 C 4.648438 12.617188 5.244141 13.017578 5.927734 13.310547 C 6.611328 13.603516 7.34375 13.75 8.125 13.75 C 8.899739 13.75 9.628906 13.601889 10.3125 13.305664 C 10.996094 13.00944 11.591797 12.607422 12.099609 12.099609 C 12.607421 11.591797 13.009439 10.996094 13.305664 10.3125 C 13.601888 9.628906 13.75 8.89974 13.75 8.125 Z " />
|
||||
</controls:SettingsCard.HeaderIcon>
|
||||
</controls:SettingsCard>
|
||||
|
||||
<controls:SettingsCard Description="{x:Bind domain:Translator.SettingsAppPreferences_EmailSyncInterval_Description}" Header="{x:Bind domain:Translator.SettingsAppPreferences_EmailSyncInterval_Title}">
|
||||
<muxc:NumberBox
|
||||
Minimum="1"
|
||||
PlaceholderText="3"
|
||||
SpinButtonPlacementMode="Inline"
|
||||
Value="{x:Bind ViewModel.EmailSyncIntervalMinutes, Mode=TwoWay}" />
|
||||
<controls:SettingsCard.HeaderIcon>
|
||||
<PathIcon Data="F1 M 0 9.375 C 0 8.509115 0.110677 7.677409 0.332031 6.879883 C 0.553385 6.082357 0.867513 5.335287 1.274414 4.638672 C 1.681315 3.942059 2.169596 3.30892 2.739258 2.739258 C 3.308919 2.169598 3.942057 1.681316 4.638672 1.274414 C 5.335286 0.867514 6.082356 0.553387 6.879883 0.332031 C 7.677409 0.110678 8.509114 0 9.375 0 C 10.234375 0 11.062825 0.112305 11.860352 0.336914 C 12.657877 0.561523 13.404947 0.877279 14.101562 1.28418 C 14.798176 1.691082 15.431314 2.179363 16.000977 2.749023 C 16.570637 3.318686 17.058918 3.951824 17.46582 4.648438 C 17.872721 5.345053 18.188477 6.092123 18.413086 6.889648 C 18.637695 7.687175 18.75 8.515625 18.75 9.375 C 18.75 10.240886 18.637695 11.072592 18.413086 11.870117 C 18.188477 12.667644 17.872721 13.413086 17.46582 14.106445 C 17.058918 14.799805 16.570637 15.431315 16.000977 16.000977 C 15.431314 16.570639 14.799804 17.05892 14.106445 17.46582 C 13.413085 17.872721 12.666015 18.188477 11.865234 18.413086 C 11.064453 18.637695 10.234375 18.75 9.375 18.75 C 8.509114 18.75 7.675781 18.639322 6.875 18.417969 C 6.074219 18.196615 5.327148 17.882486 4.633789 17.475586 C 3.94043 17.068686 3.308919 16.580404 2.739258 16.010742 C 2.169596 15.441081 1.681315 14.80957 1.274414 14.116211 C 0.867513 13.422852 0.553385 12.675781 0.332031 11.875 C 0.110677 11.074219 0 10.240886 0 9.375 Z M 17.5 9.375 C 17.5 8.626303 17.403971 7.905273 17.211914 7.211914 C 17.019855 6.518556 16.746418 5.87077 16.391602 5.268555 C 16.036783 4.666342 15.613606 4.119467 15.12207 3.62793 C 14.630533 3.136395 14.083658 2.713217 13.481445 2.358398 C 12.879231 2.003582 12.231445 1.730145 11.538086 1.538086 C 10.844727 1.346029 10.123697 1.25 9.375 1.25 C 8.626302 1.25 7.905273 1.346029 7.211914 1.538086 C 6.518555 1.730145 5.870768 2.003582 5.268555 2.358398 C 4.666341 2.713217 4.119466 3.136395 3.62793 3.62793 C 3.136393 4.119467 2.713216 4.666342 2.358398 5.268555 C 2.003581 5.87077 1.730143 6.518556 1.538086 7.211914 C 1.346029 7.905273 1.25 8.626303 1.25 9.375 C 1.25 10.123698 1.346029 10.844727 1.538086 11.538086 C 1.730143 12.231445 2.001953 12.879232 2.353516 13.481445 C 2.705078 14.083659 3.128255 14.632162 3.623047 15.126953 C 4.117838 15.621745 4.666341 16.044922 5.268555 16.396484 C 5.870768 16.748047 6.518555 17.019857 7.211914 17.211914 C 7.905273 17.403971 8.626302 17.5 9.375 17.5 C 10.123697 17.5 10.844727 17.403971 11.538086 17.211914 C 12.231445 17.019857 12.879231 16.748047 13.481445 16.396484 C 14.083658 16.044922 14.63216 15.621745 15.126953 15.126953 C 15.621744 14.632162 16.044922 14.083659 16.396484 13.481445 C 16.748047 12.879232 17.019855 12.231445 17.211914 11.538086 C 17.403971 10.844727 17.5 10.123698 17.5 9.375 Z M 9.375 10 C 9.205729 10 9.059244 9.938151 8.935547 9.814453 C 8.811849 9.690756 8.75 9.544271 8.75 9.375 L 8.75 4.375 C 8.75 4.20573 8.811849 4.059246 8.935547 3.935547 C 9.059244 3.81185 9.205729 3.75 9.375 3.75 C 9.544271 3.75 9.690755 3.81185 9.814453 3.935547 C 9.93815 4.059246 10 4.20573 10 4.375 L 10 8.75 L 13.125 8.75 C 13.294271 8.75 13.440755 8.81185 13.564453 8.935547 C 13.68815 9.059245 13.75 9.205729 13.75 9.375 C 13.75 9.544271 13.68815 9.690756 13.564453 9.814453 C 13.440755 9.938151 13.294271 10 13.125 10 Z " />
|
||||
</controls:SettingsCard.HeaderIcon>
|
||||
</controls:SettingsCard>
|
||||
</StackPanel>
|
||||
|
||||
<VisualStateManager.VisualStateGroups>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
xmlns:helpers="using:Wino.Helpers"
|
||||
xmlns:imapsetup="using:Wino.Views.ImapSetup"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
|
||||
xmlns:picker="using:Microsoft.UI.Xaml.Controls"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<ScrollViewer>
|
||||
@@ -118,7 +118,7 @@
|
||||
Header="{x:Bind domain:Translator.IMAPSetupDialog_IncomingMailServer}"
|
||||
Text="{x:Bind ViewModel.ServerInformation.IncomingServer, Mode=TwoWay}" />
|
||||
|
||||
<muxc:NumberBox
|
||||
<picker:NumberBox
|
||||
Grid.Row="2"
|
||||
Header="{x:Bind domain:Translator.IMAPSetupDialog_IncomingMailServerPort}"
|
||||
Maximum="65535"
|
||||
@@ -169,7 +169,7 @@
|
||||
Header="{x:Bind domain:Translator.IMAPSetupDialog_OutgoingMailServer}"
|
||||
Text="{x:Bind ViewModel.ServerInformation.OutgoingServer, Mode=TwoWay}" />
|
||||
|
||||
<muxc:NumberBox
|
||||
<picker:NumberBox
|
||||
Grid.Row="2"
|
||||
Grid.Column="2"
|
||||
Header="{x:Bind domain:Translator.IMAPSetupDialog_OutgoingMailServerPort}"
|
||||
@@ -215,13 +215,13 @@
|
||||
Orientation="Horizontal"
|
||||
Spacing="12">
|
||||
|
||||
<muxc:ProgressRing
|
||||
Width="20"
|
||||
Height="20"
|
||||
<ProgressRing
|
||||
Width="5"
|
||||
Height="5"
|
||||
IsActive="{x:Bind ViewModel.ValidateImapSettingsCommand.IsRunning, Mode=OneWay}" />
|
||||
<Button Command="{x:Bind ViewModel.ValidateImapSettingsCommand}" Content="Test" />
|
||||
<Button
|
||||
Command="{x:Bind ViewModel.UpdateCustomServerInformationCommand}"
|
||||
Command="{x:Bind ViewModel.SaveWithoutGoBackCommand}"
|
||||
Content="{x:Bind domain:Translator.Buttons_Save}"
|
||||
Style="{ThemeResource AccentButtonStyle}" />
|
||||
</StackPanel>
|
||||
|
||||
@@ -83,7 +83,6 @@
|
||||
<PackageReference Include="Microsoft.UI.Xaml" />
|
||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Uwp.Managed" />
|
||||
<PackageReference Include="Nito.AsyncEx" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
|
||||
<PackageReference Include="sqlite-net-pcl" />
|
||||
<PackageReference Include="Win2D.uwp" />
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Wino.Messaging.UI;
|
||||
|
||||
public record MailReadStatusChanged(Guid UniqueId);
|
||||
@@ -47,16 +47,16 @@ public class ServerContext :
|
||||
IRecipient<OnlineSearchRequested>,
|
||||
IRecipient<AccountCacheResetMessage>
|
||||
{
|
||||
private const double MinimumSynchronizationIntervalMinutes = 1;
|
||||
|
||||
private readonly System.Timers.Timer _timer = new System.Timers.Timer();
|
||||
private readonly System.Timers.Timer _timer;
|
||||
private static object connectionLock = new object();
|
||||
|
||||
private AppServiceConnection connection = null;
|
||||
|
||||
private readonly IDatabaseService _databaseService;
|
||||
private readonly IApplicationConfiguration _applicationFolderConfiguration;
|
||||
private readonly ISynchronizerFactory _synchronizerFactory;
|
||||
private readonly IServerMessageHandlerFactory _serverMessageHandlerFactory;
|
||||
private readonly IAccountService _accountService;
|
||||
private readonly IPreferencesService _preferencesService;
|
||||
private readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions
|
||||
{
|
||||
TypeInfoResolver = new ServerRequestTypeInfoResolver()
|
||||
@@ -66,35 +66,21 @@ public class ServerContext :
|
||||
IApplicationConfiguration applicationFolderConfiguration,
|
||||
ISynchronizerFactory synchronizerFactory,
|
||||
IServerMessageHandlerFactory serverMessageHandlerFactory,
|
||||
IAccountService accountService,
|
||||
IPreferencesService preferencesService)
|
||||
IAccountService accountService)
|
||||
{
|
||||
_preferencesService = preferencesService;
|
||||
// Setup timer for synchronization.
|
||||
|
||||
_timer = new System.Timers.Timer(1000 * 60 * 3); // 1 minute
|
||||
_timer.Elapsed += SynchronizationTimerTriggered;
|
||||
_preferencesService.PropertyChanged += PreferencesUpdated;
|
||||
|
||||
_databaseService = databaseService;
|
||||
_applicationFolderConfiguration = applicationFolderConfiguration;
|
||||
_synchronizerFactory = synchronizerFactory;
|
||||
_serverMessageHandlerFactory = serverMessageHandlerFactory;
|
||||
_accountService = accountService;
|
||||
|
||||
WeakReferenceMessenger.Default.RegisterAll(this);
|
||||
|
||||
// Setup timer for synchronization.
|
||||
RestartSynchronizationTimer();
|
||||
}
|
||||
|
||||
private void PreferencesUpdated(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == nameof(IPreferencesService.EmailSyncIntervalMinutes))
|
||||
RestartSynchronizationTimer();
|
||||
}
|
||||
|
||||
private void RestartSynchronizationTimer()
|
||||
{
|
||||
_timer.Stop();
|
||||
|
||||
// Ensure that the interval is at least 1 minute.
|
||||
_timer.Interval = 1000 * 60 * Math.Max(MinimumSynchronizationIntervalMinutes, _preferencesService.EmailSyncIntervalMinutes);
|
||||
_timer.Start();
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
<PackageReference Include="H.NotifyIcon.Wpf" />
|
||||
<PackageReference Include="CommunityToolkit.WinUI.Notifications" />
|
||||
<PackageReference Include="Microsoft.Identity.Client" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -408,11 +408,6 @@ public class AccountService : BaseDatabaseService, IAccountService
|
||||
ReportUIChange(new AccountUpdatedMessage(account));
|
||||
}
|
||||
|
||||
public async Task UpdateAccountCustomServerInformationAsync(CustomServerInformation customServerInformation)
|
||||
{
|
||||
await Connection.UpdateAsync(customServerInformation).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task UpdateAccountAliasesAsync(Guid accountId, List<MailAccountAlias> aliases)
|
||||
{
|
||||
// Delete existing ones.
|
||||
|
||||
@@ -10,5 +10,5 @@ public class ApplicationConfiguration : IApplicationConfiguration
|
||||
public string PublisherSharedFolderPath { get; set; }
|
||||
public string ApplicationTempFolderPath { get; set; }
|
||||
|
||||
public string SentryDNS => "https://81365d32d74c6f223a0674a2fb7bade5@o4509722249134080.ingest.de.sentry.io/4509722259095632";
|
||||
public string ApplicationInsightsInstrumentationKey => "a5a07c2f-6e24-4055-bfc9-88e87eef873a";
|
||||
}
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using Ical.Net.CalendarComponents;
|
||||
using Ical.Net.DataTypes;
|
||||
using SqlKata;
|
||||
using Wino.Core.Domain;
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Core.Domain.Models.Calendar;
|
||||
using Wino.Messaging.Client.Calendar;
|
||||
@@ -58,27 +51,7 @@ public class CalendarService : BaseDatabaseService, ICalendarService
|
||||
|
||||
public async Task DeleteCalendarItemAsync(Guid calendarItemId)
|
||||
{
|
||||
var calendarItem = await Connection.GetAsync<CalendarItem>(calendarItemId);
|
||||
|
||||
if (calendarItem == null) return;
|
||||
|
||||
List<CalendarItem> eventsToRemove = new() { calendarItem };
|
||||
|
||||
// In case of parent event, delete all child events as well.
|
||||
if (!string.IsNullOrEmpty(calendarItem.Recurrence))
|
||||
{
|
||||
var recurringEvents = await Connection.Table<CalendarItem>().Where(a => a.RecurringCalendarItemId == calendarItemId).ToListAsync().ConfigureAwait(false);
|
||||
|
||||
eventsToRemove.AddRange(recurringEvents);
|
||||
}
|
||||
|
||||
foreach (var @event in eventsToRemove)
|
||||
{
|
||||
await Connection.Table<CalendarItem>().DeleteAsync(x => x.Id == @event.Id).ConfigureAwait(false);
|
||||
await Connection.Table<CalendarEventAttendee>().DeleteAsync(a => a.CalendarItemId == @event.Id).ConfigureAwait(false);
|
||||
|
||||
WeakReferenceMessenger.Default.Send(new CalendarItemDeleted(@event));
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CreateNewCalendarItemAsync(CalendarItem calendarItem, List<CalendarEventAttendee> attendees)
|
||||
@@ -98,83 +71,8 @@ public class CalendarService : BaseDatabaseService, ICalendarService
|
||||
|
||||
public async Task<List<CalendarItem>> GetCalendarEventsAsync(IAccountCalendar calendar, DayRangeRenderModel dayRangeRenderModel)
|
||||
{
|
||||
// TODO: We might need to implement caching here.
|
||||
// I don't know how much of the events we'll have in total, but this logic scans all events every time for given calendar.
|
||||
|
||||
var accountEvents = await Connection.Table<CalendarItem>()
|
||||
.Where(x => x.CalendarId == calendar.Id && !x.IsHidden).ToListAsync();
|
||||
|
||||
var result = new List<CalendarItem>();
|
||||
|
||||
foreach (var ev in accountEvents)
|
||||
{
|
||||
ev.AssignedCalendar = calendar;
|
||||
|
||||
// Parse recurrence rules
|
||||
var calendarEvent = new CalendarEvent
|
||||
{
|
||||
Start = new CalDateTime(ev.StartDate),
|
||||
End = new CalDateTime(ev.EndDate),
|
||||
};
|
||||
|
||||
if (string.IsNullOrEmpty(ev.Recurrence))
|
||||
{
|
||||
// No recurrence, only check if we fall into the given period.
|
||||
|
||||
if (ev.Period.OverlapsWith(dayRangeRenderModel.Period))
|
||||
{
|
||||
result.Add(ev);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This event has recurrences.
|
||||
// Wino stores exceptional recurrent events as a separate calendar item, without the recurrence rule.
|
||||
// Because each instance of recurrent event can have different attendees, properties etc.
|
||||
// Even though the event is recurrent, each updated instance is a separate calendar item.
|
||||
// Calculate the all recurrences, and remove the exceptional instances like hidden ones.
|
||||
|
||||
var recurrenceLines = Regex.Split(ev.Recurrence, Constants.CalendarEventRecurrenceRuleSeperator);
|
||||
|
||||
foreach (var line in recurrenceLines)
|
||||
{
|
||||
calendarEvent.RecurrenceRules.Add(new RecurrencePattern(line));
|
||||
}
|
||||
|
||||
// Calculate occurrences in the range.
|
||||
var occurrences = calendarEvent.GetOccurrences(dayRangeRenderModel.Period.Start, dayRangeRenderModel.Period.End);
|
||||
|
||||
// Get all recurrent exceptional calendar events.
|
||||
var exceptionalRecurrences = await Connection.Table<CalendarItem>()
|
||||
.Where(a => a.RecurringCalendarItemId == ev.Id)
|
||||
.ToListAsync()
|
||||
.ConfigureAwait(false);
|
||||
|
||||
foreach (var occurrence in occurrences)
|
||||
{
|
||||
var exactInstanceCheck = exceptionalRecurrences.FirstOrDefault(a =>
|
||||
a.Period.OverlapsWith(dayRangeRenderModel.Period));
|
||||
|
||||
if (exactInstanceCheck == null)
|
||||
{
|
||||
// There is no exception for the period.
|
||||
// Change the instance StartDate and Duration.
|
||||
|
||||
var recurrence = ev.CreateRecurrence(occurrence.Period.StartTime.Value, occurrence.Period.Duration.TotalSeconds);
|
||||
|
||||
result.Add(recurrence);
|
||||
}
|
||||
else
|
||||
{
|
||||
// There is a single instance of this recurrent event.
|
||||
// It will be added as single item if it's not hidden.
|
||||
// We don't need to do anything here.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
// TODO
|
||||
return new List<CalendarItem>();
|
||||
}
|
||||
|
||||
public Task<AccountCalendar> GetAccountCalendarAsync(Guid accountCalendarId)
|
||||
@@ -221,7 +119,7 @@ public class CalendarService : BaseDatabaseService, ICalendarService
|
||||
}
|
||||
|
||||
public Task<List<CalendarEventAttendee>> GetAttendeesAsync(Guid calendarEventTrackingId)
|
||||
=> Connection.Table<CalendarEventAttendee>().Where(x => x.CalendarItemId == calendarEventTrackingId).ToListAsync();
|
||||
=> Connection.Table<CalendarEventAttendee>().Where(x => x.EventId == calendarEventTrackingId).ToListAsync();
|
||||
|
||||
public async Task<List<CalendarEventAttendee>> ManageEventAttendeesAsync(Guid calendarItemId, List<CalendarEventAttendee> allAttendees)
|
||||
{
|
||||
@@ -230,7 +128,7 @@ public class CalendarService : BaseDatabaseService, ICalendarService
|
||||
// Clear all attendees.
|
||||
var query = new Query()
|
||||
.From(nameof(CalendarEventAttendee))
|
||||
.Where(nameof(CalendarEventAttendee.CalendarItemId), calendarItemId)
|
||||
.Where(nameof(CalendarEventAttendee.EventId), calendarItemId)
|
||||
.AsDelete();
|
||||
|
||||
connection.Execute(query.GetRawQuery());
|
||||
@@ -239,67 +137,12 @@ public class CalendarService : BaseDatabaseService, ICalendarService
|
||||
connection.InsertAll(allAttendees);
|
||||
});
|
||||
|
||||
return await Connection.Table<CalendarEventAttendee>().Where(a => a.CalendarItemId == calendarItemId).ToListAsync();
|
||||
return await Connection.Table<CalendarEventAttendee>().Where(a => a.EventId == calendarItemId).ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<CalendarItem> GetCalendarItemTargetAsync(CalendarItemTarget targetDetails)
|
||||
{
|
||||
var eventId = targetDetails.Item.Id;
|
||||
|
||||
// Get the event by Id first.
|
||||
var item = await GetCalendarItemAsync(eventId).ConfigureAwait(false);
|
||||
|
||||
bool isRecurringChild = targetDetails.Item.IsRecurringChild;
|
||||
bool isRecurringParent = targetDetails.Item.IsRecurringParent;
|
||||
|
||||
if (targetDetails.TargetType == CalendarEventTargetType.Single)
|
||||
{
|
||||
if (isRecurringChild)
|
||||
{
|
||||
if (item == null)
|
||||
{
|
||||
// This is an occurrence of a recurring event.
|
||||
// They don't exist in db.
|
||||
|
||||
return targetDetails.Item;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Single exception occurrence of recurring event.
|
||||
// Return the item.
|
||||
|
||||
return item;
|
||||
}
|
||||
}
|
||||
else if (isRecurringParent)
|
||||
{
|
||||
// Parent recurring events are never listed.
|
||||
Debugger.Break();
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Single event.
|
||||
return item;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Series.
|
||||
|
||||
if (isRecurringChild)
|
||||
{
|
||||
// Return the parent.
|
||||
return await GetCalendarItemAsync(targetDetails.Item.RecurringCalendarItemId.Value).ConfigureAwait(false);
|
||||
}
|
||||
else if (isRecurringParent)
|
||||
return item;
|
||||
else
|
||||
{
|
||||
// NA. Single events don't have series.
|
||||
Debugger.Break();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// TODO
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
1124
Wino.Services/CalendarServiceEx.cs
Normal file
1124
Wino.Services/CalendarServiceEx.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using MimeKit;
|
||||
using Serilog;
|
||||
using SqlKata;
|
||||
@@ -585,10 +584,6 @@ public class MailService : BaseDatabaseService, IMailService
|
||||
if (item.IsRead == isRead) return false;
|
||||
|
||||
item.IsRead = isRead;
|
||||
if (isRead && item.UniqueId != Guid.Empty)
|
||||
{
|
||||
WeakReferenceMessenger.Default.Send(new MailReadStatusChanged(item.UniqueId));
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
37
Wino.Services/Misc/WinoTelemetryConverter.cs
Normal file
37
Wino.Services/Misc/WinoTelemetryConverter.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.ApplicationInsights.Channel;
|
||||
using Microsoft.ApplicationInsights.DataContracts;
|
||||
using Serilog.Events;
|
||||
using Serilog.Sinks.ApplicationInsights.TelemetryConverters;
|
||||
|
||||
namespace Wino.Services.Misc;
|
||||
|
||||
internal class WinoTelemetryConverter : EventTelemetryConverter
|
||||
{
|
||||
private readonly string _userDiagnosticId;
|
||||
|
||||
public WinoTelemetryConverter(string userDiagnosticId)
|
||||
{
|
||||
_userDiagnosticId = userDiagnosticId;
|
||||
}
|
||||
|
||||
public override IEnumerable<ITelemetry> Convert(LogEvent logEvent, IFormatProvider formatProvider)
|
||||
{
|
||||
foreach (ITelemetry telemetry in base.Convert(logEvent, formatProvider))
|
||||
{
|
||||
// Assign diagnostic id as user id.
|
||||
telemetry.Context.User.Id = _userDiagnosticId;
|
||||
|
||||
yield return telemetry;
|
||||
}
|
||||
}
|
||||
|
||||
public override void ForwardPropertiesToTelemetryProperties(LogEvent logEvent, ISupportProperties telemetryProperties, IFormatProvider formatProvider)
|
||||
{
|
||||
ForwardPropertiesToTelemetryProperties(logEvent, telemetryProperties, formatProvider,
|
||||
includeLogLevel: true,
|
||||
includeRenderedMessage: true,
|
||||
includeMessageTemplate: false);
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ public static class ServicesContainerSetup
|
||||
services.AddSingleton<IMimeFileService, MimeFileService>();
|
||||
|
||||
services.AddTransient<ICalendarService, CalendarService>();
|
||||
services.AddTransient<ICalendarServiceEx, CalendarServiceEx>();
|
||||
services.AddTransient<IMailService, MailService>();
|
||||
services.AddTransient<IFolderService, FolderService>();
|
||||
services.AddTransient<IAccountService, AccountService>();
|
||||
@@ -29,7 +30,5 @@ public static class ServicesContainerSetup
|
||||
services.AddTransient<IOutlookThreadingStrategy, OutlookThreadingStrategy>();
|
||||
services.AddTransient<IGmailThreadingStrategy, GmailThreadingStrategy>();
|
||||
services.AddTransient<IImapThreadingStrategy, ImapThreadingStrategy>();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,18 +9,15 @@
|
||||
<PackageReference Include="HtmlAgilityPack" />
|
||||
<PackageReference Include="Ical.Net" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
|
||||
<PackageReference Include="Sentry.Serilog" />
|
||||
<PackageReference Include="Serilog" />
|
||||
<PackageReference Include="Serilog.Sinks.Debug" />
|
||||
<PackageReference Include="Serilog.Sinks.File" />
|
||||
<PackageReference Include="Serilog.Exceptions" />
|
||||
<PackageReference Include="Serilog.Sinks.ApplicationInsights" />
|
||||
<PackageReference Include="SqlKata" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" />
|
||||
<ProjectReference Include="..\Wino.Messages\Wino.Messaging.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Misc\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,9 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
using Sentry;
|
||||
using Microsoft.ApplicationInsights;
|
||||
using Microsoft.ApplicationInsights.Extensibility;
|
||||
using Serilog;
|
||||
using Serilog.Core;
|
||||
using Serilog.Exceptions;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Services.Misc;
|
||||
|
||||
namespace Wino.Services;
|
||||
|
||||
@@ -11,12 +13,16 @@ public class WinoLogger : IWinoLogger
|
||||
{
|
||||
private readonly LoggingLevelSwitch _levelSwitch = new LoggingLevelSwitch();
|
||||
private readonly IPreferencesService _preferencesService;
|
||||
private readonly IApplicationConfiguration _applicationConfiguration;
|
||||
private readonly TelemetryConfiguration _telemetryConfiguration;
|
||||
|
||||
public TelemetryClient TelemetryClient { get; private set; }
|
||||
|
||||
public WinoLogger(IPreferencesService preferencesService, IApplicationConfiguration applicationConfiguration)
|
||||
{
|
||||
_preferencesService = preferencesService;
|
||||
_applicationConfiguration = applicationConfiguration;
|
||||
_telemetryConfiguration = new TelemetryConfiguration(applicationConfiguration.ApplicationInsightsInstrumentationKey);
|
||||
|
||||
TelemetryClient = new TelemetryClient(_telemetryConfiguration);
|
||||
|
||||
RefreshLoggingLevel();
|
||||
}
|
||||
@@ -36,34 +42,13 @@ public class WinoLogger : IWinoLogger
|
||||
// This call seems weird, but it is necessary to make sure the diagnostic id is set.
|
||||
_preferencesService.DiagnosticId = _preferencesService.DiagnosticId;
|
||||
|
||||
// Initialize Sentry
|
||||
SentrySdk.Init(options =>
|
||||
{
|
||||
options.Dsn = _applicationConfiguration.SentryDNS;
|
||||
#if DEBUG
|
||||
options.Debug = false;
|
||||
#else
|
||||
options.Debug = true;
|
||||
#endif
|
||||
options.AutoSessionTracking = true;
|
||||
|
||||
// Set user context
|
||||
options.SetBeforeSend((sentryEvent, hint) =>
|
||||
{
|
||||
sentryEvent.User = new SentryUser
|
||||
{
|
||||
Id = _preferencesService.DiagnosticId
|
||||
};
|
||||
return sentryEvent;
|
||||
});
|
||||
});
|
||||
var insightsTelemetryConverter = new WinoTelemetryConverter(_preferencesService.DiagnosticId);
|
||||
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.MinimumLevel.ControlledBy(_levelSwitch)
|
||||
.WriteTo.File(fullLogFilePath, retainedFileCountLimit: 3, rollOnFileSizeLimit: true, rollingInterval: RollingInterval.Day)
|
||||
.WriteTo.Sentry(minimumBreadcrumbLevel: Serilog.Events.LogEventLevel.Information,
|
||||
minimumEventLevel: Serilog.Events.LogEventLevel.Error)
|
||||
.WriteTo.Debug()
|
||||
.WriteTo.ApplicationInsights(TelemetryClient, insightsTelemetryConverter, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error)
|
||||
.Enrich.FromLogContext()
|
||||
.Enrich.WithExceptionDetails()
|
||||
.CreateLogger();
|
||||
@@ -71,17 +56,8 @@ public class WinoLogger : IWinoLogger
|
||||
|
||||
public void TrackEvent(string eventName, Dictionary<string, string> properties = null)
|
||||
{
|
||||
SentrySdk.AddBreadcrumb(eventName, data: properties);
|
||||
if (TelemetryClient == null) return;
|
||||
|
||||
SentrySdk.ConfigureScope(scope =>
|
||||
{
|
||||
if (properties != null)
|
||||
{
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
scope.SetTag(prop.Key, prop.Value);
|
||||
}
|
||||
}
|
||||
});
|
||||
TelemetryClient.TrackEvent(eventName, properties);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user