This commit is contained in:
Patrick Simpson 2017-01-31 10:01:31 +01:00
commit 7fbab4dfa3
32 changed files with 1249 additions and 48 deletions

24
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,24 @@
# How to contribute to the Kopano OL Extension
If you have found an issue and want to report an issue, either reach out to us
in our [forum](http://forum.kopano.com), or, if you have a subscription, open
up a [support case](https://kopano.com/support/).
To provide changesets,
- Clone the repository from https://stash.kopano.io/ or
https://github.com/Kopano-mirror/ .
- Commit and [sign your work](
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v4.10-rc4#n416)
(```git commit -s```).
- Upload commits to a git store of your choosing, or export the series as a
patchset using [git format-patch](https://git-scm.com/docs/git-format-patch).
- Send the patch(es) or git link to
[contributing@kopano.io](mailto:contributing@kopano.io) and we will consider
the submission.
## Additional notes
- Please only work on one issue per commit.
- Before implementing a new feature, get in contact with us, so we can
determine the impact.

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# Kopano OL Extension
We live in a world where it is a commodity to work with apps or web interfaces just have a look at the big amounts of HTML5-apps on your tablets and smartphones. However, there are situations in which a rich application is needed. Think about working offline during a five hour flight or deeper integrations like writing series of letters in your Office suite.
This is exactly why we developed the Kopano Outlook Extension (KOE). If you are on the road a lot and thus without an internet connection, or if you rely heavily on specialised plugins in Outlook, then the Kopano OL Extension might just be the thing for you.
# Documentation
In-depth documentation, such as administration and user manuals, about our
products be be found on our [Documentation Portal](https://documentation.kopano.io/). Additionally a [Knowledge Base](https://kb.kopano.io/) is available for quick start guides, handy code
snippets, and troubleshooting help.
# Contributing
The main development of Kopano Core takes place in a [private Bitbucket
instance](https://stash.kopano.io/projects/KOE/repos/kopano_ol_extension_source/)
with development tickets organised in [Jira](https://jira.kopano.io/projects/KC/). Please see
[CONTRIBUTING.md](CONTRIBUTING.md) for steps on how to contribute patches.
# Downloading compiled packages
Compiled packages are only available to subscription
holders from the the [Kopano Portal](https://portal.kopano.com/) and a
[package repository](
https://download.kopano.io/supported/olextension:/).
# Support
Community Support is available through the [Kopano Forum](
https://forum.kopano.io/) and through the #Kopano channel on Freenode IRC
network. [Additional support options](https://kopano.com/support/) are
available for subscription holders.

View File

@ -1,12 +1,14 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25123.0
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AcaciaZPushPlugin", "AcaciaZPushPlugin\AcaciaZPushPlugin.csproj", "{1A7427A5-F814-4B07-98B2-C67D758B65D6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginDebugger", "PluginDebugger\PluginDebugger.csproj", "{9258AD17-0A25-4669-A95C-93EC70882551}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OutlookRestarter", "OutlookRestarter\OutlookRestarter.csproj", "{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -41,6 +43,18 @@ Global
{9258AD17-0A25-4669-A95C-93EC70882551}.Release|x64.Build.0 = Release|Any CPU
{9258AD17-0A25-4669-A95C-93EC70882551}.Release|x86.ActiveCfg = Release|Any CPU
{9258AD17-0A25-4669-A95C-93EC70882551}.Release|x86.Build.0 = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x64.ActiveCfg = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x64.Build.0 = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x86.ActiveCfg = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x86.Build.0 = Debug|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|Any CPU.Build.0 = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x64.ActiveCfg = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x64.Build.0 = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x86.ActiveCfg = Release|Any CPU
{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -237,6 +237,7 @@
<Compile Include="Controls\KUITask.cs" />
<Compile Include="Controls\KUIUtil.cs" />
<Compile Include="DebugOptions.cs" />
<Compile Include="Features\SecondaryContacts\FeatureSecondaryContacts.cs" />
<Compile Include="Features\DebugSupport\AboutDialog.cs">
<SubType>Form</SubType>
</Compile>

View File

@ -71,6 +71,7 @@ namespace Acacia
public const string ZPUSH_HEADER_GAB_NAME = "X-Push-GAB-Name";
public const string ZPUSH_HEADER_CAPABILITIES = "X-Push-Capabilities";
public const string ZPUSH_HEADER_CLIENT_CAPABILITIES = "X-Push-Plugin-Capabilities";
public const string ZPUSH_HEADER_PLUGIN = "X-Push-Plugin";
public const string ZPUSH_HEADER_VERSION = "X-Z-Push-Version";

View File

@ -68,19 +68,25 @@ namespace Acacia
}
public class EnumOption<EnumType> : Option<EnumType>
where EnumType : struct
{
private readonly EnumType? _defaultValue;
private EnumType DefaultValue
{
get
{
if (_defaultValue.HasValue)
return (EnumType)_defaultValue;
return (EnumType)typeof(EnumType).GetEnumValues().GetValue(0);
}
}
public EnumOption(string token)
public EnumOption(string token, EnumType? defaultValue = null)
:
base(token)
{
this._defaultValue = defaultValue;
}
public override string GetToken(EnumType value)

View File

@ -63,6 +63,11 @@ namespace Acacia.Features
get { return ThisAddIn.Instance.Application; }
}
virtual public void GetCapabilities(ZPushCapabilities caps)
{
caps.Add(Name.ToLower());
}
#region Debug options
public static string GetFeatureName(Type featureType)

View File

@ -33,6 +33,7 @@ namespace Acacia.Features
typeof(FreeBusy.FeatureFreeBusy),
typeof(GAB.FeatureGAB),
typeof(Notes.FeatureNotes),
typeof(SecondaryContacts.FeatureSecondaryContacts),
typeof(SendAs.FeatureSendAs),
typeof(DebugSupport.FeatureDebugSupport)
};

View File

@ -84,7 +84,7 @@ namespace Acacia.Features.Notes
PatchIfConfirmed(folder);
}
private bool IsNotesFolder(OutlookConstants.SyncType type)
private bool IsNotesFolder(OutlookConstants.SyncType? type)
{
return type == OutlookConstants.SyncType.Note || type == OutlookConstants.SyncType.UserNote;
}
@ -128,7 +128,7 @@ namespace Acacia.Features.Notes
return;
// Patch if needed
OutlookConstants.SyncType type = FolderUtils.GetFolderSyncType(folder);
OutlookConstants.SyncType? type = FolderUtils.GetFolderSyncType(folder);
Logger.Instance.Trace(this, "Notes folder type: {0}", type);
if (IsNotesFolder(type))
{
@ -174,7 +174,7 @@ namespace Acacia.Features.Notes
return;
// Unpatch if needed
OutlookConstants.SyncType type = FolderUtils.GetFolderSyncType(folder, true);
OutlookConstants.SyncType? type = FolderUtils.GetFolderSyncType(folder, true);
Logger.Instance.Trace(this, "Notes folder type: {0}", type);
// Unpatch only if the original type is a notes folder, but the current type isn't
if (IsNotesFolder(type) && !IsNotesFolder(FolderUtils.GetFolderSyncType(folder)))

View File

@ -48,6 +48,12 @@ namespace Acacia.Features.OutOfOffice
Watcher.ZPushAccountChange += Watcher_ZPushAccountChange;
}
override public void GetCapabilities(ZPushCapabilities caps)
{
caps.Add("oof");
caps.Add("ooftime");
}
private static bool IsOOFEnabled(ActiveSync.SettingsOOF settings)
{
if (settings == null)

View File

@ -60,6 +60,12 @@ namespace Acacia.Features.ReplyFlags
}
}
override public void GetCapabilities(ZPushCapabilities caps)
{
caps.Add("receiveflags");
caps.Add("sendflags");
}
[AcaciaOption("Enables or disables the handling of update events to mail items. When a mail item is " +
"updated, it is checked to see if the reply flags are up to date. This is the main " +
"mechanism for updating reply flags that change on the server")]

View File

@ -0,0 +1,139 @@
/// Copyright 2017 Kopano b.v.
///
/// This program is free software: you can redistribute it and/or modify
/// it under the terms of the GNU Affero General Public License, version 3,
/// as published by the Free Software Foundation.
///
/// This program is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
/// GNU Affero General Public License for more details.
///
/// You should have received a copy of the GNU Affero General Public License
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
///
/// Consult LICENSE file for details
using Acacia.Stubs;
using Acacia.Stubs.OutlookWrappers;
using Acacia.Utils;
using Acacia.ZPush;
using Microsoft.Office.Interop.Outlook;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Acacia.DebugOptions;
namespace Acacia.Features.SecondaryContacts
{
[AcaciaOption("Provides the possibility to synchronise multiple contacts folders to and from a Z-Push server.")]
public class FeatureSecondaryContacts : Feature
{
private const string SUFFIX_CONTACTS = "\x200B";
private class FolderRegistrationSecondaryContacts : FolderRegistration
{
public FolderRegistrationSecondaryContacts(Feature feature) : base(feature)
{
}
public override bool IsApplicable(IFolder folder)
{
// Check the sync type.
// Also allow again if the sync type is user contact, it may not have been fully patched.
if (FolderUtils.GetFolderSyncType(folder) != OutlookConstants.SyncType.Unknown &&
FolderUtils.GetFolderSyncType(folder) != OutlookConstants.SyncType.UserContact)
return false;
// Check the hidden suffix
if (!folder.Name.EndsWith(SUFFIX_CONTACTS))
return false;
return true;
}
}
// Contains the ids of folders for which we've shown a warning. This is both to prevent
// warning multiple times and to detect the case when the app has been restarted.
private readonly HashSet<string> _warnedFolders = new HashSet<string>();
public FeatureSecondaryContacts()
{
}
public override void Startup()
{
Watcher.WatchFolder(new FolderRegistrationSecondaryContacts(this),
OnUnpatchedFolderDiscovered);
}
private void OnUnpatchedFolderDiscovered(IFolder folder)
{
string strippedName = folder.Name.StripSuffix(SUFFIX_CONTACTS);
Logger.Instance.Debug(this, "Patching secondary contacts folder: {0}", strippedName);
// To patch we need to do the following
// 1) Update the sync type from 18 to 14
// 2) Update the container class from Note to Contact
// 3) Patch the name
// Note that the above steps need to be done in this order and individually for this to work.
//
// At some point after 2 we also need to restart Outlook to make it appear in the list of contact folders.
// So, when the folder is detected, we make it invisible and perform steps 1 and 2. We issue a warning
// that Outlook must be restarted. When the folder is detected again and is invisible, that means we've restarted
// At this point the name is patched and the folder is made visible.
if (!folder.AttrHidden)
{
// Stage 1
// Sync type
Logger.Instance.Trace(this, "Setting sync type");
folder.SetProperty(OutlookConstants.PR_EAS_SYNCTYPE, (int)OutlookConstants.SyncType.UserContact);
// Container type
Logger.Instance.Trace(this, "Setting container class");
folder.SetProperty(OutlookConstants.PR_CONTAINER_CLASS, "IPF.Contact");
// Make it invisible.
folder.AttrHidden = true;
Logger.Instance.Debug(this, "Patched secondary contacts folder: {0}", strippedName);
// Register and show a warning, if not already done.
// Note that patching may be done multiple times.
if (!_warnedFolders.Contains(folder.EntryId))
{
_warnedFolders.Add(folder.EntryId);
if (MessageBox.Show(StringUtil.GetResourceString("SecondaryContactsPatched_Body", strippedName),
StringUtil.GetResourceString("SecondaryContactsPatched_Title"),
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning
) == DialogResult.Yes)
{
ThisAddIn.Instance.Restart();
}
}
}
// If _warnedFolders does not contain the folder (and it's hidden), this means Outlook was restarted.
else if (!_warnedFolders.Contains(folder.EntryId))
{
// Stage 2
// Patch the name
Logger.Instance.Trace(this, "Patching name");
folder.Name = strippedName;
// Show it
folder.AttrHidden = false;
Logger.Instance.Debug(this, "Shown secondary contacts folder: {0}", strippedName);
}
}
}
}

View File

@ -30,7 +30,7 @@ using static Acacia.DebugOptions;
namespace Acacia.Features.SendAs
{
[AcaciaOption("Provides the ability to select different senders for Z-Push accounts.")]
public class FeatureSendAs : FeatureDisabled
public class FeatureSendAs : Feature
{
private FeatureSharedFolders _sharedFolders;

View File

@ -51,7 +51,7 @@ namespace Acacia
get { return GetOption(null, THREADING); }
set { SetOption(null, THREADING, value); }
}
private static readonly EnumOption<Threading> THREADING = new EnumOption<Threading>("Threading");
private static readonly EnumOption<Threading> THREADING = new EnumOption<Threading>("Threading", Threading.Background);
[AcaciaOption("Enables or disables ZPush account checking. To enable advanced features, it must be known " +
"which accounts use ZPush servers. This option checks responses from ActiveSync servers to " +

View File

@ -83,6 +83,8 @@ namespace Acacia
public const string PR_SUBJECT = PROP + "0037" + PT_UNICODE;
public const string PR_CONTAINER_CLASS = PROP + "3613" + PT_UNICODE;
#endregion
#region Email specific
@ -120,6 +122,7 @@ namespace Acacia
public const string PR_EAS_SYNCTYPE = PROP + "6A1A" + PT_LONG;
public const string PR_EAS_SYNC2 = PROP + "6A1D" + PT_BOOLEAN;
public const string PR_NET_FOLDER_FLAGS = PROP + "36DE" + PT_LONG;
public const string PR_EAS_NAME = PROP + "6915" + PT_UNICODE;
public enum SyncType
{

View File

@ -785,6 +785,24 @@ namespace Acacia.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to To synchronise the contacts folder &apos;{0}&apos;, Outlook must be restarted. Click &apos;Yes&apos; to restart Outlook now, or &apos;No&apos; if you plan to restart Outlook later..
/// </summary>
internal static string SecondaryContactsPatched_Body {
get {
return ResourceManager.GetString("SecondaryContactsPatched_Body", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Contacts folder.
/// </summary>
internal static string SecondaryContactsPatched_Title {
get {
return ResourceManager.GetString("SecondaryContactsPatched_Title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unable to open the shared folder. Please ensure you have permission to open the shared folder..
/// </summary>

View File

@ -431,4 +431,12 @@
<data name="Ribbon_About_Supertip" xml:space="preserve">
<value>Shows the about dialog, which contains licensing and version information.</value>
</data>
<data name="SecondaryContactsPatched_Body" xml:space="preserve">
<value>To synchronise the contacts folder '{0}', Outlook must be restarted. Click 'Yes' to restart Outlook now, or 'No' if you plan to restart Outlook later.</value>
<comment>Shown when a secondary contact folder is detected, to inform the user that a restart is required</comment>
</data>
<data name="SecondaryContactsPatched_Title" xml:space="preserve">
<value>Contacts folder</value>
<comment>Shown when a secondary contact folder is detected, to inform the user that a restart is required</comment>
</data>
</root>

View File

@ -112,7 +112,14 @@ namespace Acacia.Stubs.OutlookWrappers
{
get
{
return Props.GetProperty(OutlookConstants.PR_ATTR_HIDDEN);
try
{
return Props.GetProperty(OutlookConstants.PR_ATTR_HIDDEN);
}
catch(System.Exception)
{
return false;
}
}
set
{

View File

@ -29,6 +29,9 @@ using Acacia.UI;
using Acacia.ZPush;
using System.Globalization;
using Acacia.UI.Outlook;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Reflection;
namespace Acacia
{
@ -188,6 +191,35 @@ namespace Acacia
#endregion
#region Misc helpers
public void SendReceive()
{
Outlook.NameSpace session = Application.Session;
session.SendAndReceive(false);
ComRelease.Release(session);
}
public void Restart()
{
// Can not use the assembly location, as that is in the GAC
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
// Create the path to the restarter
path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), "OutlookRestarter.exe");
// Run that
Process process = new Process();
process.StartInfo = new ProcessStartInfo(path, Environment.CommandLine);
process.Start();
// And close us
Application.Quit();
}
#endregion
#region Ribbons
private OutlookUI _outlookUI;

View File

@ -28,17 +28,19 @@ namespace Acacia.Utils
{
public static class FolderUtils
{
public static OutlookConstants.SyncType GetFolderSyncType(IFolder folder, bool orig = false)
public static OutlookConstants.SyncType? GetFolderSyncType(IFolder folder, bool orig = false)
{
if (orig)
{
string type = (string)folder.GetProperty(OutlookConstants.PR_EAS_SYNCTYPE_ORIG);
if (string.IsNullOrEmpty(type))
return null;
return (OutlookConstants.SyncType)int.Parse(type);
}
else
{
int type = (int)folder.GetProperty(OutlookConstants.PR_EAS_SYNCTYPE);
return (OutlookConstants.SyncType)type;
int? type = (int?)folder.GetProperty(OutlookConstants.PR_EAS_SYNCTYPE);
return (OutlookConstants.SyncType?)type;
}
}

View File

@ -47,6 +47,7 @@ namespace Acacia.ZPush.Connect
static ZPushConnection()
{
ServicePointManager.ServerCertificateValidationCallback = HandleCertificateError;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
}
private static readonly Dictionary<string, bool> _allowCertificateErrors = new Dictionary<string, bool>();
@ -280,7 +281,7 @@ namespace Acacia.ZPush.Connect
string url = string.Format(ACTIVESYNC_URL, _account.ServerURL, _account.DeviceId,
request.Command, _account.UserName, "WindowsOutlook");
// Parse the body
// Construct the body
WBXMLDocument doc = new WBXMLDocument();
doc.LoadXml(request.Body);
doc.VersionNumber = 1.3;
@ -292,6 +293,9 @@ namespace Acacia.ZPush.Connect
{
Logger.Instance.Trace(this, "Sending request: {0} -> {1}", _account.ServerURL, doc.ToXMLString());
content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-sync.wbxml");
string caps = ZPushCapabilities.Client.ToString();
Logger.Instance.Trace(this, "Sending request: {0} -> {1}: {2}", _account.ServerURL, caps, doc.ToXMLString());
content.Headers.Add(Constants.ZPUSH_HEADER_CLIENT_CAPABILITIES, caps);
using (HttpResponseMessage response = _client.PostAsync(url, content, _cancel).Result)
{
return new Response(response);

View File

@ -72,7 +72,7 @@ namespace Acacia.ZPush
/// </summary>
public void SendReceive()
{
ThisAddIn.Instance.Application.Session.SendAndReceive(false);
ThisAddIn.Instance.SendReceive();
}
#endregion

View File

@ -1,4 +1,6 @@
/// Copyright 2016 Kopano b.v.

using Acacia.Features;
/// Copyright 2016 Kopano b.v.
///
/// This program is free software: you can redistribute it and/or modify
/// it under the terms of the GNU Affero General Public License, version 3,
@ -13,7 +15,6 @@
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
///
/// Consult LICENSE file for details
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -50,9 +51,26 @@ namespace Acacia.ZPush
return _capabilities.Contains(capability);
}
public void Add(string capability)
{
_capabilities.Add(capability);
}
public override string ToString()
{
return string.Join(",", _capabilities);
}
public static ZPushCapabilities Client
{
get
{
ZPushCapabilities caps = new ZPushCapabilities();
foreach (Feature feature in ThisAddIn.Instance.Features)
feature.GetCapabilities(caps);
return caps;
}
}
}
}

View File

@ -169,46 +169,54 @@ namespace Acacia.ZPush
private void SubFolders_FolderAdd(MAPIFolder folder)
{
Logger.Instance.Debug(this, "Folder added in {0}: {1}", this._item.Name, folder.Name);
WatchChild((Folder)folder);
try
{
Logger.Instance.Debug(this, "Folder added in {0}: {1}", this._item.Name, folder.Name);
WatchChild((Folder)folder);
}
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderAdd: {0}: {1}", Name, e); }
}
private void SubFolders_FolderRemove()
{
Logger.Instance.Debug(this, "Folder removed from {0}", this._item.Name);
// Helpfully, Outlook doesn't tell us which folder was removed. Could use the BeforeFolderMove event instead,
// but that doesn't fire if a folder was removed on the server.
// Hence, fetch all the remaining folder ids, and remove any folder that no longer exists.
HashSet<string> remaining = new HashSet<string>();
foreach (Folder child in _subFolders)
try
{
try
Logger.Instance.Debug(this, "Folder removed from {0}", this._item.Name);
// Helpfully, Outlook doesn't tell us which folder was removed. Could use the BeforeFolderMove event instead,
// but that doesn't fire if a folder was removed on the server.
// Hence, fetch all the remaining folder ids, and remove any folder that no longer exists.
HashSet<string> remaining = new HashSet<string>();
foreach (Folder child in _subFolders)
{
remaining.Add(child.EntryID);
try
{
remaining.Add(child.EntryID);
}
catch (System.Exception e) { Logger.Instance.Warning(this, "Ignoring failed child: {0}", e); }
}
catch (System.Exception e) { Logger.Instance.Warning(this, "Ignoring failed child: {0}", e); }
}
// Find the folders that need to be removed. There should be only one, but with Outlook we can never be sure,
// so compare all. We cannot modify the dictionary during iteration, so store entries to be removed in a
// temporary list
List<KeyValuePair<string, ZPushFolder>> remove = new List<KeyValuePair<string, ZPushFolder>>();
foreach (var entry in _children)
{
if (!remaining.Contains(entry.Key))
// Find the folders that need to be removed. There should be only one, but with Outlook we can never be sure,
// so compare all. We cannot modify the dictionary during iteration, so store entries to be removed in a
// temporary list
List<KeyValuePair<string, ZPushFolder>> remove = new List<KeyValuePair<string, ZPushFolder>>();
foreach (var entry in _children)
{
remove.Add(entry);
if (!remaining.Contains(entry.Key))
{
remove.Add(entry);
}
}
// Actually remove the folders
foreach (var entry in remove)
{
Logger.Instance.Debug(this, "Removing subfolder {0}, {1}", this._item.Name, entry.Key);
_children.Remove(entry.Key);
entry.Value.Cleanup();
}
}
// Actually remove the folders
foreach (var entry in remove)
{
Logger.Instance.Debug(this, "Removing subfolder {0}, {1}", this._item.Name, entry.Key);
_children.Remove(entry.Key);
entry.Value.Cleanup();
}
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderRemove: {0}: {1}", Name, e); }
}
private void SubFolders_FolderChange(MAPIFolder folder)
@ -231,10 +239,7 @@ namespace Acacia.ZPush
WatchChild((Folder)folder);
}
}
catch(System.Exception e)
{
Logger.Instance.Trace(this, "FolderChange exception: {0}: {1}", Name, e);
}
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderChange: {0}: {1}", Name, e); }
}
private void Items_ItemAdd(object oItem)

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>OutlookRestarter</RootNamespace>
<AssemblyName>OutlookRestarter</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Build\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Build\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Kopano.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Kopano.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OutlookRestarter
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo = new ProcessStartInfo(args[0], string.Join(" ", args.Skip(1)));
process.Start();
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("OutlookRestarter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutlookRestarter")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("222c4da5-fa31-471a-b127-5e0c6ad2cb3c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -656,6 +656,20 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Supertip"
msgid "Shows the about dialog, which contains licensing and version information."
msgstr ""
#. Shown when a secondary contact folder is detected, to inform the user that a restart is required
#: AcaciaZPushPlugin\Properties\Resources\SecondaryContactsPatched_Body
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SecondaryContactsPatched_Body"
msgid "To synchronise the contacts folder \'{0}\', Outlook must be restarted. Click \'Yes\' to restart Outlook now, or \'No\' if you plan to restart Outlook later."
msgstr ""
#. Shown when a secondary contact folder is detected, to inform the user that a restart is required
#: AcaciaZPushPlugin\Properties\Resources\SecondaryContactsPatched_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SecondaryContactsPatched_Title"
msgid "Contacts folder"
msgstr ""
#: AcaciaZPushPlugin\UI\ProgressDialog\labelMessage.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\labelMessage.Text"

View File

@ -658,6 +658,20 @@ msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Supertip"
msgid "Shows the about dialog, which contains licensing and version information."
msgstr "Shows the about dialog, which contains licensing and version information."
#. Shown when a secondary contact folder is detected, to inform the user that a restart is required
#: AcaciaZPushPlugin\Properties\Resources\SecondaryContactsPatched_Body
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SecondaryContactsPatched_Body"
msgid "To synchronise the contacts folder \'{0}\', Outlook must be restarted. Click \'Yes\' to restart Outlook now, or \'No\' if you plan to restart Outlook later."
msgstr "To synchronise the contacts folder \'{0}\', Outlook must be restarted. Click \'Yes\' to restart Outlook now, or \'No\' if you plan to restart Outlook later."
#. Shown when a secondary contact folder is detected, to inform the user that a restart is required
#: AcaciaZPushPlugin\Properties\Resources\SecondaryContactsPatched_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SecondaryContactsPatched_Title"
msgid "Contacts folder"
msgstr "Contacts folder"
#: AcaciaZPushPlugin\UI\ProgressDialog\labelMessage.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\labelMessage.Text"

715
translations/nb.po Normal file
View File

@ -0,0 +1,715 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-12 16:12+0000\n"
"PO-Revision-Date: 2017-01-14 09:53+0000\n"
"Last-Translator: Klaus <klaus@linuxavdelingen.no>\n"
"Language-Team: Norwegian Bokmål <http://translate.kopano.io/projects/kopano"
"/kopano-ol-extension/nb/>\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.4\n"
#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonApply.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonApply.Text"
msgid "Apply"
msgstr "Bruk"
#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonCancel.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonCancel.Text"
msgid "Cancel"
msgstr "Avbryt"
#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonClose.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonClose.Text"
msgid "Close"
msgstr "Lukk"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelTitle.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelTitle.Text"
msgid "Kopano OL Extension"
msgstr "Kopano OL Extension"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelVersionCaption.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelVersionCaption.Text"
msgid "Version"
msgstr "Versjon"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelRevisionCaption.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelRevisionCaption.Text"
msgid "Revision"
msgstr "Revisjon"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\textLicense.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\textLicense.Text"
msgid ""
msgstr ""
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelDateCaption.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelDateCaption.Text"
msgid "Date"
msgstr "Dato"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\linkKopano.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\linkKopano.Text"
msgid "https://kopano.com/"
msgstr "https://kopano.com/"
#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\$this.Text"
msgid "About Kopano OL Extenion"
msgstr "Om Kopano OL Extenion"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonGC.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonGC.Text"
msgid "Run GC"
msgstr "Kjør GC"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonRefresh.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonRefresh.Text"
msgid "Refresh"
msgstr "Oppdater"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonClose.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonClose.Text"
msgid "Close"
msgstr "Lukk"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonLog.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonLog.Text"
msgid "Log"
msgstr "Logg"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\$this.Text"
msgid "Debug"
msgstr "Feilsøk"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\labelLogLevel.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\labelLogLevel.Text"
msgid "Log level:"
msgstr "Loggnivå:"
#: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\buttonShowLog.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\buttonShowLog.Text"
msgid "Open log file location"
msgstr "Åpne loggfilplassering"
#: AcaciaZPushPlugin\Features\FreeBusy\FreeBusySettings\checkGABLookup.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\FreeBusy\\FreeBusySettings\\checkGABLookup.Text"
msgid "Look up contacts in Global Address Book"
msgstr "Søk etter kontakter i Global Adresse Bok"
#: AcaciaZPushPlugin\Features\FreeBusy\FreeBusySettings\labelUseAccount.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\FreeBusy\\FreeBusySettings\\labelUseAccount.Text"
msgid "Use account: "
msgstr "Bruk konto: "
#: AcaciaZPushPlugin\Features\GAB\GABSettings\buttonGABResync.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\GAB\\GABSettings\\buttonGABResync.Text"
msgid "Resynchronise Global Address Books"
msgstr ""
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\chkEnable.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\chkEnable.Text"
msgid "Enable out-of-office auto-responding"
msgstr ""
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\radioNoTime.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\radioNoTime.Text"
msgid "until further notice"
msgstr ""
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\radioTime.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\radioTime.Text"
msgid "from"
msgstr "Fra"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeFrom.CustomFormat
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeFrom.CustomFormat"
msgid "HH:mm"
msgstr "HH:mm"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\labelTill.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\labelTill.Text"
msgid "until"
msgstr "til"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeTill.CustomFormat
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeTill.CustomFormat"
msgid "HH:mm"
msgstr "HH:mm"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\labelBody.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\labelBody.Text"
msgid "AutoReply only once to each sender with the following text:"
msgstr ""
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\btnCancel.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\btnCancel.Text"
msgid "Cancel"
msgstr "Avbryt"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\btnSave.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\btnSave.Text"
msgid "Save"
msgstr "Lagre"
#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\$this.Text"
msgid "Out of Office Assistant for {0}"
msgstr ""
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\labelSelectUser.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\labelSelectUser.Text"
msgid "Open folders for user"
msgstr ""
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\buttonOpenUser.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\buttonOpenUser.Text"
msgid "Open"
msgstr "Åpne"
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelName.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelName.Text"
msgid "Share as"
msgstr "Del som"
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelSendAs.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelSendAs.Text"
msgid "Send as owner"
msgstr ""
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelPermissions.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelPermissions.Text"
msgid "Permissions"
msgstr "Tillatelser"
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\labelPermissionsValue.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\labelPermissionsValue.Text"
msgid "Permissions"
msgstr "Tillatelser"
#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\$this.Text"
msgid "Shared Folders - {0}"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFGet_Failed
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFGet_Failed"
msgid "Unable to retrieve Out of Office settings. You can still enable or disable Out of Office, but applying the settings might fail."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFGet_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFGet_Label"
msgid "Retrieving current Out of Office settings"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFGet_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFGet_Title"
msgid "Out of Office Assistant"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_DifferentState
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_DifferentState"
msgid ""
"Out of office has been enabled, but the server could not handle your full request.\n"
"\n"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_Disabled
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_Disabled"
msgid "Out of Office has been disabled."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_DisableFailed
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_DisableFailed"
msgid "Unable to disable Out of Office."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_Enabled
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_Enabled"
msgid "Out of Office has been enabled until further notice."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_EnabledTimeBased
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_EnabledTimeBased"
msgid "Out of Office has been enabled from {0} till {1}."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_EnableFailed
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_EnableFailed"
msgid "Unable to enable Out of Office."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_Failed
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_Failed"
msgid "Unable to apply Out of Office settings"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_Label"
msgid "Applying Out of Office settings"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFSet_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFSet_Title"
msgid "Out of Office Assistant"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Debug_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Debug_Label"
msgid "Debug"
msgstr "Feilsøk"
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Debug_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Debug_Screentip"
msgid "Debug dialog"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Debug_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Debug_Supertip"
msgid "Opens the debug dialog, which shows information on the Kopano Outlook Extension."
msgstr ""
#. The group label for the ribbon
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_GroupMain_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_GroupMain_Label"
msgid "Kopano"
msgstr "Kopano"
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_OOF_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_OOF_Label"
msgid "Out-of-Office"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_OOF_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_OOF_Screentip"
msgid "Change Out-of-Office settings"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_OOF_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_OOF_Supertip"
msgid "Opens a dialog which allows Out-of-Office settings to be viewed or modified."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Settings_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Settings_Label"
msgid "Settings"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Settings_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Settings_Screentip"
msgid "Settings dialog"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Settings_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Settings_Supertip"
msgid "Opens the settings dialog, which allows configuration of the plugin and access to support functions."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFStartup_Message
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFStartup_Message"
msgid "Out of Office is currently enabled on account \'{0}\'. Would you like to change the settings?"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\OOFStartup_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\OOFStartup_Title"
msgid "Out of Office Assistant"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\GABEvent_Body
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GABEvent_Body"
msgid "Modifications to the Global Address Book are not allowed. Please contact your administrator if you think changes are required."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\GABEvent_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GABEvent_Title"
msgid "Global Address Book"
msgstr "Global Adresse Bok"
#: AcaciaZPushPlugin\Properties\Resources\GAB_FolderFormat
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GAB_FolderFormat"
msgid "Address Book for {0}"
msgstr "Adressebok for {0}"
#: AcaciaZPushPlugin\Properties\Resources\LocalStore_DisplayName
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\LocalStore_DisplayName"
msgid "Kopano Folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_DebugSupport
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_DebugSupport"
msgid "Support"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_FreeBusy
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_FreeBusy"
msgid "Free/Busy"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_GAB
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_GAB"
msgid "Global Address Book"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_Notes
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_Notes"
msgid "Notes"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_OutOfOffice
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_OutOfOffice"
msgid "Out of office"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Feature_ReplyFlags
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Feature_ReplyFlags"
msgid "Reply flags"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\ThisAddIn_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\ThisAddIn_Title"
msgid "Kopano"
msgstr "Kopano"
#: AcaciaZPushPlugin\Properties\Resources\SSLFailed_Body
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SSLFailed_Body"
msgid "There is an error with the security certificate for server {0}. Do you want to allow the connection anyway?"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SSLFailed_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SSLFailed_Title"
msgid "Certificate error"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Title"
msgid "Kopano"
msgstr "Kopano"
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Adding_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Adding_Label"
msgid "Opening shared folder"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Adding_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Adding_Title"
msgid "Shared folders"
msgstr ""
#. {0} will be replaced with the folder name
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Closing_Confirm
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Closing_Confirm"
msgid "Close shared folder {0}?"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Closing_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Closing_Label"
msgid "Closing shared folder"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Closing_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Closing_Title"
msgid "Shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Adding_Failure
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Adding_Failure"
msgid "Unable to open the shared folder. Please ensure you have permission to open the shared folder."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Closing_Failure
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Closing_Failure"
msgid "Unable to close the shared folder."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Label"
msgid "Open WebApp"
msgstr "Åpne WebApp"
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Screentip"
msgid "Open WebApp"
msgstr "Åpne WebApp"
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Supertip"
msgid "Open WebApp in the system default browser"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Label"
msgid "Shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Screentip"
msgid "Manage shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Supertip"
msgid "Open the \"Shared Folders\" dialog, which can be used to add or remove shared folders."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_PublicFolders
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_PublicFolders"
msgid "Public folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Loading
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Loading"
msgid "Retrieving shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Loading_Error
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Loading_Error"
msgid "There was an error retrieving shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_None
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_None"
msgid "No shared folders are available"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Fetching_Failure
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Fetching_Failure"
msgid "Unable to retrieve shared folders. Please try again later."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Fetching_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Fetching_Label"
msgid "Retrieving shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Fetching_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Fetching_Title"
msgid "Shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Unsaved_Changes
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Unsaved_Changes"
msgid "There are unsaved changes. Do you really want to to discard these?"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Context_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Context_Label"
msgid "Manage shared folder"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Context_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Context_Screentip"
msgid "Manage this folder in the Shared Folders dialog"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_SharedFolders_Context_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_SharedFolders_Context_Supertip"
msgid "Open the \"Shared Folders\" dialog for the currently selected folder."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Applying_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Applying_Label"
msgid "Applying changes to shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Applying_Failure
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Applying_Failure"
msgid "Unable to apply the changes to the shared folders. Please try again later."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Applying_Title
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Applying_Title"
msgid "Shared folders"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_None
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_None"
msgid "None"
msgstr "Ingen"
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Read
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Read"
msgid "Read"
msgstr "Lese"
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Write
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Write"
msgid "Write"
msgstr "Skrive"
#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Applying_Success
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Applying_Success"
msgid "The changes to the shared folders have been applied successfully."
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_About_Label
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Label"
msgid "About"
msgstr "Om"
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_About_Screentip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Screentip"
msgid "About dialog"
msgstr ""
#: AcaciaZPushPlugin\Properties\Resources\Ribbon_About_Supertip
#, csharp-format
msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Supertip"
msgid "Shows the about dialog, which contains licensing and version information."
msgstr ""
#: AcaciaZPushPlugin\UI\ProgressDialog\labelMessage.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\labelMessage.Text"
msgid "labelMessage: SET FROM CODE, NO NEED TO TRANSLATE"
msgstr ""
#: AcaciaZPushPlugin\UI\ProgressDialog\buttonCancel.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\buttonCancel.Text"
msgid "Cancel"
msgstr "Avbryt"
#: AcaciaZPushPlugin\UI\ProgressDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\$this.Text"
msgid "ProgressDialog: SET FROM CODE, NO NEED TO TRANSLATE"
msgstr ""
#: AcaciaZPushPlugin\UI\SettingsDialog\buttonApply.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonApply.Text"
msgid "Apply"
msgstr ""
#: AcaciaZPushPlugin\UI\SettingsDialog\buttonCancel.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonCancel.Text"
msgid "Cancel"
msgstr "Avbryt"
#: AcaciaZPushPlugin\UI\SettingsDialog\buttonOK.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonOK.Text"
msgid "OK"
msgstr "OK"
#: AcaciaZPushPlugin\UI\SettingsDialog\$this.Text
#, csharp-format
msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\$this.Text"
msgid "Kopano Settings"
msgstr ""