From a418c13d1880617aa785468e1ae7216276419745 Mon Sep 17 00:00:00 2001 From: Felix Bartels Date: Thu, 12 Jan 2017 09:09:08 +0100 Subject: [PATCH 01/15] =?UTF-8?q?Add=20requested=20Norwegian=20Bokm=C3=A5l?= =?UTF-8?q?=20translation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- translations/nb.po | 700 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 700 insertions(+) create mode 100644 translations/nb.po diff --git a/translations/nb.po b/translations/nb.po new file mode 100644 index 0000000..0b2bc60 --- /dev/null +++ b/translations/nb.po @@ -0,0 +1,700 @@ +#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonApply.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonApply.Text" +msgid "Apply" +msgstr "" + +#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonCancel.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonCancel.Text" +msgid "Cancel" +msgstr "" + +#: AcaciaZPushPlugin\Controls\KDialogButtons\buttonClose.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonClose.Text" +msgid "Close" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelTitle.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelTitle.Text" +msgid "Kopano OL Extension" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelVersionCaption.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelVersionCaption.Text" +msgid "Version" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelRevisionCaption.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelRevisionCaption.Text" +msgid "Revision" +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\linkKopano.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\linkKopano.Text" +msgid "https://kopano.com/" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\$this.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\$this.Text" +msgid "About Kopano OL Extenion" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonGC.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonGC.Text" +msgid "Run GC" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonRefresh.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonRefresh.Text" +msgid "Refresh" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonClose.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonClose.Text" +msgid "Close" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonLog.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonLog.Text" +msgid "Log" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\$this.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\$this.Text" +msgid "Debug" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\labelLogLevel.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\labelLogLevel.Text" +msgid "Log level:" +msgstr "" + +#: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\buttonShowLog.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\buttonShowLog.Text" +msgid "Open log file location" +msgstr "" + +#: AcaciaZPushPlugin\Features\FreeBusy\FreeBusySettings\checkGABLookup.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\FreeBusy\\FreeBusySettings\\checkGABLookup.Text" +msgid "Look up contacts in Global Address Book" +msgstr "" + +#: AcaciaZPushPlugin\Features\FreeBusy\FreeBusySettings\labelUseAccount.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\FreeBusy\\FreeBusySettings\\labelUseAccount.Text" +msgid "Use account: " +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeFrom.CustomFormat +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeFrom.CustomFormat" +msgid "HH:mm" +msgstr "" + +#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\labelTill.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\labelTill.Text" +msgid "until" +msgstr "" + +#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeTill.CustomFormat +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeTill.CustomFormat" +msgid "HH:mm" +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\btnSave.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\btnSave.Text" +msgid "Save" +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelName.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelName.Text" +msgid "Share as" +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\labelPermissionsValue.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\labelPermissionsValue.Text" +msgid "Permissions" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: AcaciaZPushPlugin\Properties\Resources\GAB_FolderFormat +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GAB_FolderFormat" +msgid "Address Book for {0}" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Screentip +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Screentip" +msgid "Open WebApp" +msgstr "" + +#: 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 "" + +#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Read +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Read" +msgid "Read" +msgstr "" + +#: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Write +#, csharp-format +msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Write" +msgid "Write" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: AcaciaZPushPlugin\UI\SettingsDialog\buttonOK.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonOK.Text" +msgid "OK" +msgstr "" + +#: AcaciaZPushPlugin\UI\SettingsDialog\$this.Text +#, csharp-format +msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\$this.Text" +msgid "Kopano Settings" +msgstr "" + From 945bad54e0fda54870ae5ed3613acfcda9af6ce9 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 14 Jan 2017 09:53:44 +0100 Subject: [PATCH 02/15] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 37.0% (43 of 116 strings) --- translations/nb.po | 103 ++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/translations/nb.po b/translations/nb.po index 0b2bc60..050155b 100644 --- a/translations/nb.po +++ b/translations/nb.po @@ -1,38 +1,54 @@ +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 \n" +"Language-Team: Norwegian Bokmål \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 "" +msgstr "Bruk" #: AcaciaZPushPlugin\Controls\KDialogButtons\buttonCancel.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonCancel.Text" msgid "Cancel" -msgstr "" +msgstr "Avbryt" #: AcaciaZPushPlugin\Controls\KDialogButtons\buttonClose.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Controls\\KDialogButtons\\buttonClose.Text" msgid "Close" -msgstr "" +msgstr "Lukk" #: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelTitle.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelTitle.Text" msgid "Kopano OL Extension" -msgstr "" +msgstr "Kopano OL Extension" #: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelVersionCaption.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelVersionCaption.Text" msgid "Version" -msgstr "" +msgstr "Versjon" #: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\labelRevisionCaption.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelRevisionCaption.Text" msgid "Revision" -msgstr "" +msgstr "Revisjon" #: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\textLicense.Text #, csharp-format @@ -44,73 +60,73 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\labelDateCaption.Text" msgid "Date" -msgstr "" +msgstr "Dato" #: AcaciaZPushPlugin\Features\DebugSupport\AboutDialog\linkKopano.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\AboutDialog\\linkKopano.Text" msgid "https://kopano.com/" -msgstr "" +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 "" +msgstr "Om Kopano OL Extenion" #: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonGC.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonGC.Text" msgid "Run GC" -msgstr "" +msgstr "Kjør GC" #: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonRefresh.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonRefresh.Text" msgid "Refresh" -msgstr "" +msgstr "Oppdater" #: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonClose.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonClose.Text" msgid "Close" -msgstr "" +msgstr "Lukk" #: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\buttonLog.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\buttonLog.Text" msgid "Log" -msgstr "" +msgstr "Logg" #: AcaciaZPushPlugin\Features\DebugSupport\DebugDialog\$this.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugDialog\\$this.Text" msgid "Debug" -msgstr "" +msgstr "Feilsøk" #: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\labelLogLevel.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\labelLogLevel.Text" msgid "Log level:" -msgstr "" +msgstr "Loggnivå:" #: AcaciaZPushPlugin\Features\DebugSupport\DebugSupportSettings\buttonShowLog.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\DebugSupport\\DebugSupportSettings\\buttonShowLog.Text" msgid "Open log file location" -msgstr "" +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 "" +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 "" +msgstr "Bruk konto: " #: AcaciaZPushPlugin\Features\GAB\GABSettings\buttonGABResync.Text #, csharp-format @@ -134,25 +150,25 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\radioTime.Text" msgid "from" -msgstr "" +msgstr "Fra" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeFrom.CustomFormat #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeFrom.CustomFormat" msgid "HH:mm" -msgstr "" +msgstr "HH:mm" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\labelTill.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\labelTill.Text" msgid "until" -msgstr "" +msgstr "til" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\timeTill.CustomFormat #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\timeTill.CustomFormat" msgid "HH:mm" -msgstr "" +msgstr "HH:mm" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\labelBody.Text #, csharp-format @@ -164,13 +180,13 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\btnCancel.Text" msgid "Cancel" -msgstr "" +msgstr "Avbryt" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\btnSave.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\OutOfOffice\\OutOfOfficeDialog\\btnSave.Text" msgid "Save" -msgstr "" +msgstr "Lagre" #: AcaciaZPushPlugin\Features\OutOfOffice\OutOfOfficeDialog\$this.Text #, csharp-format @@ -188,13 +204,13 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\buttonOpenUser.Text" msgid "Open" -msgstr "" +msgstr "Åpne" #: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelName.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelName.Text" msgid "Share as" -msgstr "" +msgstr "Del som" #: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\_labelSendAs.Text #, csharp-format @@ -206,13 +222,13 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\_labelPermissions.Text" msgid "Permissions" -msgstr "" +msgstr "Tillatelser" #: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\labelPermissionsValue.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\Features\\SharedFolders\\SharedFoldersDialog\\labelPermissionsValue.Text" msgid "Permissions" -msgstr "" +msgstr "Tillatelser" #: AcaciaZPushPlugin\Features\SharedFolders\SharedFoldersDialog\$this.Text #, csharp-format @@ -298,7 +314,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Debug_Label" msgid "Debug" -msgstr "" +msgstr "Feilsøk" #: AcaciaZPushPlugin\Properties\Resources\Ribbon_Debug_Screentip #, csharp-format @@ -317,7 +333,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_GroupMain_Label" msgid "Kopano" -msgstr "" +msgstr "Kopano" #: AcaciaZPushPlugin\Properties\Resources\Ribbon_OOF_Label #, csharp-format @@ -377,13 +393,13 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GABEvent_Title" msgid "Global Address Book" -msgstr "" +msgstr "Global Adresse Bok" #: AcaciaZPushPlugin\Properties\Resources\GAB_FolderFormat #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\GAB_FolderFormat" msgid "Address Book for {0}" -msgstr "" +msgstr "Adressebok for {0}" #: AcaciaZPushPlugin\Properties\Resources\LocalStore_DisplayName #, csharp-format @@ -431,7 +447,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\ThisAddIn_Title" msgid "Kopano" -msgstr "" +msgstr "Kopano" #: AcaciaZPushPlugin\Properties\Resources\SSLFailed_Body #, csharp-format @@ -449,7 +465,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_Title" msgid "Kopano" -msgstr "" +msgstr "Kopano" #: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Adding_Label #, csharp-format @@ -498,13 +514,13 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Label" msgid "Open WebApp" -msgstr "" +msgstr "Åpne WebApp" #: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Screentip #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_WebApp_Screentip" msgid "Open WebApp" -msgstr "" +msgstr "Åpne WebApp" #: AcaciaZPushPlugin\Properties\Resources\Ribbon_WebApp_Supertip #, csharp-format @@ -618,19 +634,19 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_None" msgid "None" -msgstr "" +msgstr "Ingen" #: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Read #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Read" msgid "Read" -msgstr "" +msgstr "Lese" #: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Permission_Write #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\SharedFolders_Permission_Write" msgid "Write" -msgstr "" +msgstr "Skrive" #: AcaciaZPushPlugin\Properties\Resources\SharedFolders_Applying_Success #, csharp-format @@ -642,7 +658,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\Properties\\Resources\\Ribbon_About_Label" msgid "About" -msgstr "" +msgstr "Om" #: AcaciaZPushPlugin\Properties\Resources\Ribbon_About_Screentip #, csharp-format @@ -666,7 +682,7 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\UI\\ProgressDialog\\buttonCancel.Text" msgid "Cancel" -msgstr "" +msgstr "Avbryt" #: AcaciaZPushPlugin\UI\ProgressDialog\$this.Text #, csharp-format @@ -684,17 +700,16 @@ msgstr "" #, csharp-format msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonCancel.Text" msgid "Cancel" -msgstr "" +msgstr "Avbryt" #: AcaciaZPushPlugin\UI\SettingsDialog\buttonOK.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\buttonOK.Text" msgid "OK" -msgstr "" +msgstr "OK" #: AcaciaZPushPlugin\UI\SettingsDialog\$this.Text #, csharp-format msgctxt "AcaciaZPushPlugin\\UI\\SettingsDialog\\$this.Text" msgid "Kopano Settings" msgstr "" - From 5ab65e89355442905a978a576c2c78f77e8d6712 Mon Sep 17 00:00:00 2001 From: Felix Bartels Date: Tue, 17 Jan 2017 08:22:08 +0100 Subject: [PATCH 03/15] add readme to test mirroring --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed60d4f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Kopano OL Extension + +https://stash.kopano.io/projects/KOE/repos/kopano_ol_extension_source/ From 79257ea42bc3fda4b299609514fbcd6dedb15148 Mon Sep 17 00:00:00 2001 From: Felix Bartels Date: Tue, 17 Jan 2017 09:33:22 +0100 Subject: [PATCH 04/15] enhace readme, add contributing file --- CONTRIBUTING.md | 33 +++++++++++++++++++++++++++++++++ README.md | 26 +++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..534a5ed --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# How to contribute to Kopano Core + +While you can create an account in our [Jira]( +https://jira.kopano.io/secure/Signup!default.jspa) to get notified about +the progress of tickets, we currently do not allow external users to +create issues or pull request against our repositories. + +If you have found an issue and want to create an issue please 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 a patch please use the following workflow: + +- Clone the individual repository from https://stash.kopano.io/ +- Apply your changes to your local checkout and please include *"Released +under the Affero GNU General Public License (AGPL) version 3."* in your +commit message, so that we can safely reuse your changes. +- create a patchfile from your commits. ( +https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/ +does a nice job explaining the details.) +- send the patch to +[contributing@kopano.io](mailto:contributing@kopano.io) and we'll create +an issue and a pull request for you. + +## Additional notes + +- Please only work on one issue per patch. +- If your patch consists of multiple commits stash them into one before +creating the patch. +- A patch should usually not change more than 50 lines of code (keep your +changes small). +- Before implementing a new feature get in contact with us so we can +determine the impact. \ No newline at end of file diff --git a/README.md b/README.md index ed60d4f..79620ef 100644 --- a/README.md +++ b/README.md @@ -1,3 +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. -https://stash.kopano.io/projects/KOE/repos/kopano_ol_extension_source/ +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. From 0c7af26b6b572bb1df9c9562ebbcf140b2276d94 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 10:13:24 +0100 Subject: [PATCH 05/15] [KOE-61] Added plugin capabilities header to Z-Push calls. May still need some renaming to match server capabilities. --- .../AcaciaZPushPlugin/Constants.cs | 1 + .../AcaciaZPushPlugin/Features/Feature.cs | 5 +++++ .../ZPush/Connect/ZPushConnection.cs | 5 ++++- .../ZPush/ZPushCapabilities.cs | 22 +++++++++++++++++-- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs index d928f6e..d03a91d 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs @@ -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"; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs index afc0d80..ac4608c 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs @@ -63,6 +63,11 @@ namespace Acacia.Features get { return ThisAddIn.Instance.Application; } } + virtual public void GetCapabilities(ZPushCapabilities caps) + { + caps.Add(Name); + } + #region Debug options public static string GetFeatureName(Type featureType) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs index e527ed8..3392646 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs @@ -280,7 +280,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 +292,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); diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs index 9792e08..742c9a6 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs @@ -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. /// /// 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; + } + } } } From 7a4a53490124452effed697584174759fe77366d Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 10:34:45 +0100 Subject: [PATCH 06/15] [KOE-61] Updated names for client capabilities --- .../AcaciaZPushPlugin/AcaciaZPushPlugin.csproj | 1 + src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs | 2 +- .../Features/OutOfOffice/FeatureOutOfOffice.cs | 6 ++++++ .../Features/ReplyFlags/FeatureReplyFlags.cs | 6 ++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj index 01f73c0..c727738 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj @@ -237,6 +237,7 @@ + Form diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs index ac4608c..2460dfc 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs @@ -65,7 +65,7 @@ namespace Acacia.Features virtual public void GetCapabilities(ZPushCapabilities caps) { - caps.Add(Name); + caps.Add(Name.ToLower()); } #region Debug options diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/OutOfOffice/FeatureOutOfOffice.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/OutOfOffice/FeatureOutOfOffice.cs index 77cbf95..409df96 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/OutOfOffice/FeatureOutOfOffice.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/OutOfOffice/FeatureOutOfOffice.cs @@ -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) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/ReplyFlags/FeatureReplyFlags.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/ReplyFlags/FeatureReplyFlags.cs index 4d77a6f..e9c3df8 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/ReplyFlags/FeatureReplyFlags.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/ReplyFlags/FeatureReplyFlags.cs @@ -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")] From 1e690a63e6c9067fa9e3f8d5225c2351f0425211 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 10:35:17 +0100 Subject: [PATCH 07/15] Exception handling for some folder events, which are sometimes invoked with deleted folders. --- .../AcaciaZPushPlugin/ZPush/ZPushFolder.cs | 71 ++++++++++--------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushFolder.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushFolder.cs index 78b99ab..fb340f0 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushFolder.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushFolder.cs @@ -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 remaining = new HashSet(); - 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 remaining = new HashSet(); + 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> remove = new List>(); - 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> remove = new List>(); + 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) From 6d135c0ddc4e0cb0803440b6f92519c6d45bf54f Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 11:45:52 +0100 Subject: [PATCH 08/15] [KOE-62] Added Tls1.1 and Tls1.2 as allowed protocols --- .../AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs index 3392646..4ea9fc8 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs @@ -47,6 +47,7 @@ namespace Acacia.ZPush.Connect static ZPushConnection() { ServicePointManager.ServerCertificateValidationCallback = HandleCertificateError; + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; } private static readonly Dictionary _allowCertificateErrors = new Dictionary(); From 9e05601fe93cbb615374cafccf26578805ad3510 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 14:06:18 +0100 Subject: [PATCH 09/15] [KOE-14] Initial version of patcher. Does all the patching, but somehow doesn't work --- .../AcaciaZPushPlugin.csproj | 2 +- .../AcaciaZPushPlugin/Features/Features.cs | 1 + .../Features/Notes/FeatureNotes.cs | 6 +- .../FeatureSecondaryContacts.cs | 93 +++++++++++++++++++ .../AcaciaZPushPlugin/OutlookConstants.cs | 3 + .../AcaciaZPushPlugin/Utils/FolderUtils.cs | 8 +- 6 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj index c727738..588180c 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj @@ -237,7 +237,7 @@ - + Form diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Features.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Features.cs index a90ee32..72acc4e 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Features.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Features.cs @@ -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) }; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Notes/FeatureNotes.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Notes/FeatureNotes.cs index 38bf5f6..a21892b 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Notes/FeatureNotes.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Notes/FeatureNotes.cs @@ -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))) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs new file mode 100644 index 0000000..cde4ab9 --- /dev/null +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs @@ -0,0 +1,93 @@ +/// 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. +/// +/// 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 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 + if (FolderUtils.GetFolderSyncType(folder) != OutlookConstants.SyncType.Unknown) + return false; + + // Check the hidden suffix + if (!folder.Name.EndsWith(SUFFIX_CONTACTS)) + return false; + Logger.Instance.Debug(this.Feature, "CONTACTS: {0} - {1}", folder.Name, StringUtil.BytesToHex(Encoding.UTF8.GetBytes(folder.Name))); + return true; + } + } + + public FeatureSecondaryContacts() + { + + } + + public override void Startup() + { + Watcher.WatchFolder(new FolderRegistrationSecondaryContacts(this), + OnUnpatchedFolderDiscovered); + } + + + private void OnUnpatchedFolderDiscovered(IFolder folder) + { + string strippedName = folder.Name.StripSuffix(SUFFIX_CONTACTS); + // Update the properties + folder.SetProperties(new string[] + { + OutlookConstants.PR_EAS_SYNCTYPE, + OutlookConstants.PR_CONTAINER_CLASS, + OutlookConstants.PR_EAS_NAME, + OutlookConstants.PR_DISPLAY_NAME, + OutlookConstants.PR_EAS_SYNC1, + OutlookConstants.PR_EAS_SYNC2 + }, new object[] + { + (int)OutlookConstants.SyncType.UserContact, + "IPF.Contact", + strippedName, + strippedName, + true, true + }); + } + + } +} \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/OutlookConstants.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/OutlookConstants.cs index 4b6ff6d..5f45c47 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/OutlookConstants.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/OutlookConstants.cs @@ -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 { diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/FolderUtils.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/FolderUtils.cs index 3b023f6..dab4d99 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/FolderUtils.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/FolderUtils.cs @@ -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; } } From ab37b666dfd0bb463a9408f5236358112317e643 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 14:06:58 +0100 Subject: [PATCH 10/15] Made "Send-As" feature enabled by default --- .../AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs index 2ad949e..0dbedcc 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs @@ -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; From 5806ee9b808a01d8609b5e815eb8927772b191b2 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 18 Jan 2017 14:13:22 +0100 Subject: [PATCH 11/15] Made "Background" the default threading option --- src/AcaciaZPushPlugin/AcaciaZPushPlugin/DebugOptions.cs | 8 +++++++- src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/DebugOptions.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/DebugOptions.cs index a5b468c..93127fa 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/DebugOptions.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/DebugOptions.cs @@ -68,19 +68,25 @@ namespace Acacia } public class EnumOption : Option + 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) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs index ceca0c8..b31b125 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/GlobalOptions.cs @@ -51,7 +51,7 @@ namespace Acacia get { return GetOption(null, THREADING); } set { SetOption(null, THREADING, value); } } - private static readonly EnumOption THREADING = new EnumOption("Threading"); + private static readonly EnumOption THREADING = new EnumOption("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 " + From 469dccddab159c8c142798358b72b5da263f9e10 Mon Sep 17 00:00:00 2001 From: Felix Bartels Date: Wed, 25 Jan 2017 10:40:35 +0100 Subject: [PATCH 12/15] update contributing to the same version used in kopano core --- CONTRIBUTING.md | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 534a5ed..44c2846 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,33 +1,24 @@ -# How to contribute to Kopano Core +# How to contribute to the Kopano OL Extension -While you can create an account in our [Jira]( -https://jira.kopano.io/secure/Signup!default.jspa) to get notified about -the progress of tickets, we currently do not allow external users to -create issues or pull request against our repositories. +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/). -If you have found an issue and want to create an issue please 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, -To provide a patch please use the following workflow: - -- Clone the individual repository from https://stash.kopano.io/ -- Apply your changes to your local checkout and please include *"Released -under the Affero GNU General Public License (AGPL) version 3."* in your -commit message, so that we can safely reuse your changes. -- create a patchfile from your commits. ( -https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/ -does a nice job explaining the details.) -- send the patch to -[contributing@kopano.io](mailto:contributing@kopano.io) and we'll create -an issue and a pull request for you. +- 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 patch. -- If your patch consists of multiple commits stash them into one before -creating the patch. -- A patch should usually not change more than 50 lines of code (keep your -changes small). -- Before implementing a new feature get in contact with us so we can -determine the impact. \ No newline at end of file +- Please only work on one issue per commit. +- Before implementing a new feature, get in contact with us, so we can +determine the impact. From 495386dea92e49ea4b20473189fd1c672fcb0460 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 25 Jan 2017 10:46:55 +0100 Subject: [PATCH 13/15] [KOE-14] Patching secondary contact folders now works --- .../FeatureSecondaryContacts.cs | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs index cde4ab9..baa5cc8 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs @@ -43,14 +43,16 @@ namespace Acacia.Features.SecondaryContacts public override bool IsApplicable(IFolder folder) { - // Check the sync type - if (FolderUtils.GetFolderSyncType(folder) != OutlookConstants.SyncType.Unknown) + // 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; - Logger.Instance.Debug(this.Feature, "CONTACTS: {0} - {1}", folder.Name, StringUtil.BytesToHex(Encoding.UTF8.GetBytes(folder.Name))); + return true; } } @@ -70,24 +72,23 @@ namespace Acacia.Features.SecondaryContacts private void OnUnpatchedFolderDiscovered(IFolder folder) { string strippedName = folder.Name.StripSuffix(SUFFIX_CONTACTS); - // Update the properties - folder.SetProperties(new string[] - { - OutlookConstants.PR_EAS_SYNCTYPE, - OutlookConstants.PR_CONTAINER_CLASS, - OutlookConstants.PR_EAS_NAME, - OutlookConstants.PR_DISPLAY_NAME, - OutlookConstants.PR_EAS_SYNC1, - OutlookConstants.PR_EAS_SYNC2 - }, new object[] - { - (int)OutlookConstants.SyncType.UserContact, - "IPF.Contact", - strippedName, - strippedName, - true, true - }); + Logger.Instance.Debug(this, "Patching secondary contacts folder: {0}", strippedName); + + // Note that somehow it fails if these are updated in one go, so do the steps individually + + // 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"); + + // And the name + Logger.Instance.Trace(this, "Patching name"); + folder.Name = strippedName; + + Logger.Instance.Debug(this, "Patched secondary contacts folder: {0}", strippedName); } - } } \ No newline at end of file From 9ba795d7aa00d101b64b3760a1e963a5531176e5 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 25 Jan 2017 14:49:00 +0100 Subject: [PATCH 14/15] [KOE-14] Added restart dialog to secondary contacts folder sync. --- src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln | 16 +++- .../FeatureSecondaryContacts.cs | 69 +++++++++++++++--- .../Properties/Resources.Designer.cs | 18 +++++ .../Properties/Resources.resx | 8 ++ .../Stubs/OutlookWrappers/OutlookWrapper.cs | 9 ++- .../AcaciaZPushPlugin/ThisAddIn.cs | 32 ++++++++ .../AcaciaZPushPlugin/ZPush/ZPushAccount.cs | 2 +- .../OutlookRestarter/App.config | 6 ++ .../OutlookRestarter/Kopano.ico | Bin 0 -> 370070 bytes .../OutlookRestarter/OutlookRestarter.csproj | 69 ++++++++++++++++++ .../OutlookRestarter/Program.cs | 20 +++++ .../Properties/AssemblyInfo.cs | 36 +++++++++ 12 files changed, 270 insertions(+), 15 deletions(-) create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/App.config create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/OutlookRestarter.csproj create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Program.cs create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln b/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln index 905ae8e..eb30fbe 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln @@ -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 diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs index baa5cc8..4952c4d 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs @@ -26,6 +26,7 @@ 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 @@ -57,6 +58,10 @@ namespace Acacia.Features.SecondaryContacts } } + // 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 _warnedFolders = new HashSet(); + public FeatureSecondaryContacts() { @@ -68,27 +73,67 @@ namespace Acacia.Features.SecondaryContacts OnUnpatchedFolderDiscovered); } - private void OnUnpatchedFolderDiscovered(IFolder folder) { string strippedName = folder.Name.StripSuffix(SUFFIX_CONTACTS); Logger.Instance.Debug(this, "Patching secondary contacts folder: {0}", strippedName); - // Note that somehow it fails if these are updated in one go, so do the steps individually + // 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. - // Sync type - Logger.Instance.Trace(this, "Setting sync type"); - folder.SetProperty(OutlookConstants.PR_EAS_SYNCTYPE, (int)OutlookConstants.SyncType.UserContact); + if (!folder.AttrHidden) + { + // Stage 1 - // Container type - Logger.Instance.Trace(this, "Setting container class"); - folder.SetProperty(OutlookConstants.PR_CONTAINER_CLASS, "IPF.Contact"); + // Sync type + Logger.Instance.Trace(this, "Setting sync type"); + folder.SetProperty(OutlookConstants.PR_EAS_SYNCTYPE, (int)OutlookConstants.SyncType.UserContact); - // And the name - Logger.Instance.Trace(this, "Patching name"); - folder.Name = strippedName; + // Container type + Logger.Instance.Trace(this, "Setting container class"); + folder.SetProperty(OutlookConstants.PR_CONTAINER_CLASS, "IPF.Contact"); - Logger.Instance.Debug(this, "Patched secondary contacts folder: {0}", strippedName); + // 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); + } } } } \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs index 22a01c6..f2f609e 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs @@ -785,6 +785,24 @@ namespace Acacia.Properties { } } + /// + /// Looks up a localized string similar to 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.. + /// + internal static string SecondaryContactsPatched_Body { + get { + return ResourceManager.GetString("SecondaryContactsPatched_Body", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contacts folder. + /// + internal static string SecondaryContactsPatched_Title { + get { + return ResourceManager.GetString("SecondaryContactsPatched_Title", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unable to open the shared folder. Please ensure you have permission to open the shared folder.. /// diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx index ccf7cde..93b5c6b 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx @@ -431,4 +431,12 @@ Shows the about dialog, which contains licensing and version information. + + 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 + + + Contacts folder + Shown when a secondary contact folder is detected, to inform the user that a restart is required + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs index 2bb4efe..36e4bcf 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs @@ -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 { diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs index 9006c34..269c820 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs @@ -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; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs index 3e70eac..09fc992 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs @@ -72,7 +72,7 @@ namespace Acacia.ZPush /// public void SendReceive() { - ThisAddIn.Instance.Application.Session.SendAndReceive(false); + ThisAddIn.Instance.SendReceive(); } #endregion diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/App.config b/src/AcaciaZPushPlugin/OutlookRestarter/App.config new file mode 100644 index 0000000..d740e88 --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico b/src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico new file mode 100644 index 0000000000000000000000000000000000000000..0b80522fe0d35a771be5385301e2e0e0d5377d9f GIT binary patch literal 370070 zcmeHw3A`jpU1q)4GxTr{u-w;c?g15$U6f_IUu9Lj?ir9FKxM7a3nxRMuUUS(V4X z`WGFM8JQ9P>-)z)A|vxP8Y_*PHTYX;9B7<%;IziipuDx^kIz_XybkB0$RD>GjSrl4 zdgEaai;v%R|3>4h&pW+w;DA5AZKLtZ^G|Qw7CGB{?rDw2L*8I2r4zMj9riN`m;@>+fp*k#*l$OjJD~hQq&=jc zC%f(S$kkPpbz{pUP-_XaoAJ2cjyCQH%zwyZ|0d+8kbaTEX-Cm2;sT2UYHcaTeAOh- z@#B6c>Ja;X>#={*W1sjBd_W66z~%x~vjO9$o)QrD4@a#u_8I##3IB-?Xt_ARd_X-d z#<;GE1Q^egml4<>?gN^b3$)D#RK*sIk9tX9f^lEiSKb!~w40a^Cf*g0JPgYppHgsJZB<-w%^x>ar7=2?>}6?aX;+~}$SnF@OC`*f^e10*3t=1!uRJ1WGP}F7`{aw`WkyZ{vQ+?a;_yyaWvUiCN+bb{^={n9cY4b@?i2g>r^u1pI)905 z&q!Ua1d_kY6J!5lz)#uM`3?KaH6iQ0q!JMJfq9PmhW(Q2(a1IlOe+E4-NpQd{b?m< z*P8^&Er9_0_poul+`2UCO#;(Mz+(Psq-EEd1gax}ij4dBqej4st@BsMG>wy-C6J8! z%~qLXe#3swc4Ey}PXeiN|56;6@fn|Czj~%=9OW#5)VOch&spBqyh)%a5=h2_-Vy0Q;BYZwlFbAG+lDPMsb<+W7Y<|BJ`{jmS^=@=I8c^?-di zw)FrCqsBjs^KOm^AHey38OMFYzPDeD>5BQ!0=B>6@qW_h#J_yNukaT5fK{9`A5c^L zR|)$V|DEmERFxd}`B}1?u`hc7KHSwCD%>`^ju({_6pPr z3^ilcuwN~O1G915f3)%139&!O2gGZFHW#Rtaiq90?56}$@wPcu*jHRHjE~F1 z^?+ZcIF4h_5Zbae!IIlXn*8osUuoz2pFyl|F~3(Vp6?0!=K!xKJpL8akHdXf&wJ!I z-2MO@+nQh+KqWq|0`}X@w!=Pnsr5QP%@EjkF+cJH!0JDG>ZQ}JoEt;2lT3-6h{g6n{M3y1dhx0E{~1-DNECPyU6bhynoSSex5o1C|}X% z1K@is4oK;wh=&38?}hTGN{Ic>wxjmFDO=fFdHk zOOs*0D~l?XfOkFXd%DMdUgLh+AB1thCS}Sv05sThfr1%Wg8isv<9@+(GY>h*v%U)( zcL(mivS9qvAA~-@JsTuV<^$%@YPR>582dN+`AHD-+w=X^V zZ}pQnrqVE@9#BY^$ydHfe?>>uU>;`IPLuh81X z0QT(Ej1ov;|I--%%d)3e>-?7q`!?OH)0aw{vU@l7xu+R7R%k(af#r#uhJ{bGY2KI08_%G_bKg4}l z4t;=I4{(2L%$^HOX$^QT=3{>3hW)9fSH2s7cdhxqrG#VuFdyLd2V4!_z>_^2oX{-0 zYkeh-`6K^~FS2$1acU3N{2vUQ?0Wo{ZR{WE1MJ=5aaIu5C(rlGJKz5_zSC=adnQx2 zy9(de(q6w;mwfCW?*r_cqC+jCi~aIG-#6?JRqwzG%==wj3?Fb8VE^kC82d;10GkU8 zG=pRxEPOy&*ZGrizwUpNYp{j~p9S7E_CL>Kf7$Q&g!s*(oU94ry8-cOL1pu-`0Q%zqNJbN}(D@r`a<>+3=F z+8q9{av1+7#~%E@m}kGPxE7c)zOpxZej<pNleWp7yU?Sg31W86P0*x5|tC zPa5`npqt47zKJFLzrtg`?y-N`*Y*1Vd`k?nD$RO;;$&cdt)%0Af_?Y^XRnzUf6W`w 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 + + + + Debug + AnyCPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C} + WinExe + Properties + OutlookRestarter + OutlookRestarter + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + ..\Build\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\Build\Release\ + TRACE + prompt + 4 + + + Kopano.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs b/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs new file mode 100644 index 0000000..8e86e2e --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs @@ -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(); + } + } +} diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs b/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0472212 --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs @@ -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")] From 41d2c75054986cb9fe66e6e51aca203083ef733e Mon Sep 17 00:00:00 2001 From: KOE_Export_Strings_Commit Date: Wed, 25 Jan 2017 13:52:23 +0100 Subject: [PATCH 15/15] Commit strings #127 --- translations/KOE.pot | 14 ++++++++++++++ translations/en.po | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/translations/KOE.pot b/translations/KOE.pot index 0b2bc60..93bbd1c 100644 --- a/translations/KOE.pot +++ b/translations/KOE.pot @@ -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" diff --git a/translations/en.po b/translations/en.po index f087d0c..84c97b0 100644 --- a/translations/en.po +++ b/translations/en.po @@ -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"