diff --git a/.github/workflows/purge-cloudflare-cache.yml b/.github/workflows/purge-cloudflare-cache.yml new file mode 100644 index 000000000..a2d288faf --- /dev/null +++ b/.github/workflows/purge-cloudflare-cache.yml @@ -0,0 +1,14 @@ +name: Purge CloudFlare Cache + +on: + page_build: + +jobs: + purge_cache: + runs-on: ubuntu-latest + steps: + - name: purge + uses: jakejarvis/cloudflare-purge-action@master + env: + CLOUDFLARE_ZONE: ${{ secrets.CLOUDFLARE_ZONE }} + CLOUDFLARE_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..9a92223ed --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,163 @@ +env: + IS_RELEASE_BRANCH: ${{ startsWith(github.ref, 'refs/heads/release/') }} + BRANCH_NAME: ${{ github.ref_name }} + +name: Build and Deploy + +on: + workflow_dispatch: + push: + branches: + - 'release/1.*' + paths-ignore: + - '.github/**' + - '.gitignore' + - '*.md' + - 'LICENSE' + - 'build-and-deploy.ps1' + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Set up .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '7.x' + + - name: Restore NuGet packages + run: msbuild src/Greenshot.sln /p:Configuration=Release /restore /t:PrepareForBuild + env: + Box13_ClientId: ${{ secrets.Box13_ClientId }} + Box13_ClientSecret: ${{ secrets.Box13_ClientSecret }} + DropBox13_ClientId: ${{ secrets.DropBox13_ClientId }} + DropBox13_ClientSecret: ${{ secrets.DropBox13_ClientSecret }} + Flickr_ClientId: ${{ secrets.Flickr_ClientId }} + Flickr_ClientSecret: ${{ secrets.Flickr_ClientSecret }} + Imgur13_ClientId: ${{ secrets.Imgur13_ClientId }} + Imgur13_ClientSecret: ${{ secrets.Imgur13_ClientSecret }} + Photobucket_ClientId: ${{ secrets.Photobucket_ClientId }} + Photobucket_ClientSecret: ${{ secrets.Photobucket_ClientSecret }} + Picasa_ClientId: ${{ secrets.Picasa_ClientId }} + Picasa_ClientSecret: ${{ secrets.Picasa_ClientSecret }} + + - name: Build and package + run: msbuild src/Greenshot.sln /p:Configuration=Release /t:Rebuild /v:normal + env: + Box13_ClientId: ${{ secrets.Box13_ClientId }} + Box13_ClientSecret: ${{ secrets.Box13_ClientSecret }} + DropBox13_ClientId: ${{ secrets.DropBox13_ClientId }} + DropBox13_ClientSecret: ${{ secrets.DropBox13_ClientSecret }} + Flickr_ClientId: ${{ secrets.Flickr_ClientId }} + Flickr_ClientSecret: ${{ secrets.Flickr_ClientSecret }} + Imgur13_ClientId: ${{ secrets.Imgur13_ClientId }} + Imgur13_ClientSecret: ${{ secrets.Imgur13_ClientSecret }} + Photobucket_ClientId: ${{ secrets.Photobucket_ClientId }} + Photobucket_ClientSecret: ${{ secrets.Photobucket_ClientSecret }} + Picasa_ClientId: ${{ secrets.Picasa_ClientId }} + Picasa_ClientSecret: ${{ secrets.Picasa_ClientSecret }} + + - name: Copy Files + run: | + mkdir -p ${{ github.workspace }}/artifacts + cp installer/Greenshot-INSTALLER-*.exe ${{ github.workspace }}/artifacts/ + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: drop + path: ${{ github.workspace }}/artifacts + + deploy: + runs-on: windows-latest + needs: build + + steps: + + - name: Checkout repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: drop # Name of the artifact uploaded in previous steps + path: drop # Local folder where artifacts are downloaded + + - name: Extract version from file name + if: env.IS_RELEASE_BRANCH == 'true' + id: version_from_filename + run: | + $file = Get-ChildItem drop -Filter "Greenshot-INSTALLER-*.exe" | Select-Object -First 1 + if (-not $file) { + throw "No matching file found in 'drop' directory." + } + if ($file.Name -match "Greenshot-INSTALLER-([\d\.]+)(.*)\.exe") { + echo "version=$($matches[1])" >> $Env:GITHUB_OUTPUT + } else { + throw "Version number could not be extracted from file name: $($file.Name)" + } + shell: pwsh + + - name: Set version from sanitized branch name + if: env.IS_RELEASE_BRANCH != 'true' + id: version_from_branchname + run: | + $branch = "${{ github.ref }}" -replace '^refs/heads/', '' + $sanitized = $branch -replace '[^a-zA-Z0-9._-]', '_' + echo "version=$sanitized" >> $Env:GITHUB_OUTPUT + shell: pwsh + + - name: Set version info + id: version_info + run: | + echo "version=${{ steps.version_from_filename.outputs.version || steps.version_from_branchname.outputs.version }}" >> $GITHUB_OUTPUT + shell: bash + + + - name: Create tag + if: env.IS_RELEASE_BRANCH == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git tag -a "v${{ steps.version_info.outputs.version }}" -m "v${{ steps.version_info.outputs.version }}" + git push origin "v${{ steps.version_info.outputs.version }}" + + - name: Rename installer for non-release branch + if: env.IS_RELEASE_BRANCH != 'true' + run: | + branch="${BRANCH_NAME:-${GITHUB_REF#refs/heads/}}" + sanitized=$(echo "$branch" | sed 's/[^a-zA-Z0-9._-]/_/g') + mv drop/Greenshot-INSTALLER-*.exe "drop/Greenshot-INSTALLER-${sanitized}.exe" + shell: bash + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + name: "Greenshot ${{ steps.version_info.outputs.version }} (continuous build)" + tag_name: ${{ env.IS_RELEASE_BRANCH == 'true' && format('v{0}', steps.version_info.outputs.version) || env.BRANCH_NAME }} + files: drop/*.exe + generate_release_notes: true + draft: ${{ env.IS_RELEASE_BRANCH != 'true' }} + prerelease: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Trigger GitHub Pages rebuild + shell: bash + run: | + curl -X POST \ + -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/${{ github.repository }}/pages/builds + diff --git a/.github/workflows/update-gh-pages.yml b/.github/workflows/update-gh-pages.yml new file mode 100644 index 000000000..ba45b70d1 --- /dev/null +++ b/.github/workflows/update-gh-pages.yml @@ -0,0 +1,18 @@ +name: Update GitHub Pages + +on: + workflow_dispatch: + release: + types: [published, unpublished, created, edited, deleted, prereleased, released] + +jobs: + update-gh-pages: + runs-on: ubuntu-latest + steps: + - name: Trigger GitHub Pages rebuild + shell: bash + run: | + curl -X POST \ + -H "Authorization: Bearer ${{ secrets.GH_PAGES_TOKEN }}" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/${{ github.repository }}/pages/builds diff --git a/.gitignore b/.gitignore index 3afd2d7ab..7e96d5501 100644 --- a/.gitignore +++ b/.gitignore @@ -214,4 +214,6 @@ ModelManifest.xml *.credentials.cs # Rider files -.idea \ No newline at end of file +.idea + +/installer/Greenshot-INSTALLER-*.exe diff --git a/README.md b/README.md index 1f47983e3..a3e9696c7 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,25 @@ Being easy to understand and configurable, Greenshot is an efficient tool for pr About this repository --------------------- -This repository is for Greenshot 1.3, currently in development, but is the next planned release +This is the development branch is for Greenshot 1.3, which has been first released on 2025-07-14. + +Releases +-------- + +You can find a list of all releases (stable and unstable) in the [Github releases](https://github.com/greenshot/greenshot/releases) or in the [version history on our website](https://getgreenshot.org/version-history/). +The [downloads page on our website](https://getgreenshot.org/downloads/) always links to the latest stable release. + +Trademark and Logo Usage Policy +------------------------------- + +The Greenshot logo and trademark are the property of the Greenshot development team. Unauthorized use of the logo and trademark is generally prohibited. However, we allow the use of the Greenshot name and logo in the following contexts: + +* In blog posts, articles, or reviews that discuss or promote the Greenshot, provided that the usage is fair and does not imply endorsement by Greenshot. +* In educational materials or presentations that accurately represent the project. + +Please refrain from using the Greenshot logo and trademark in any promotional materials, products, or in a manner that may cause confusion or imply endorsement without prior written permission. + +If you have any questions or wish to seek permission for other uses, please contact us. + +Thank you for your understanding and cooperation. + diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..324758e42 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,5 @@ +# Security Policy + +## Reporting a Vulnerability + +If you think you found a security issue in Greenshot, please report it responsibly [in our security section](https://github.com/greenshot/greenshot/security). We try to look into it as soon as possible - please give us some time for reaction, though. diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 558d40760..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,106 +0,0 @@ -# .NET Desktop -# Build and run tests for .NET Desktop or Windows classic desktop solutions. -# Add steps that publish symbols, save build artifacts, and more: -# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net - -trigger: - batch: true - branches: - include: - - 'release/1.*' - exclude: - - 'develop' - -stages: -- stage: Build - jobs: - - job: Build - variables: - - group: 'Plug-in Credentials' - - name: solution - value: 'src/Greenshot.sln' - - name: buildPlatform - value: 'Any CPU' - - name: buildConfiguration - value: 'Release' - - pool: - vmImage: 'Windows-latest' - - steps: - - task: MSBuild@1 - displayName: Restore nuget packages and generate credential templates - inputs: - solution: '$(solution)' - platform: $(buildPlatform) - configuration: $(buildConfiguration) - msbuildArguments: '/restore /t:PrepareForBuild' - - - task: MSBuild@1 - displayName: Build and package - inputs: - solution: '$(solution)' - platform: $(buildPlatform) - configuration: $(buildConfiguration) - env: - Box13_ClientId: $(Box13_ClientId) - Box13_ClientSecret: $(Box13_ClientSecret) - DropBox13_ClientId: $(DropBox13_ClientId) - DropBox13_ClientSecret: $(DropBox13_ClientSecret) - Flickr_ClientId: $(Flickr_ClientId) - Flickr_ClientSecret: $(Flickr_ClientSecret) - Imgur13_ClientId: $(Imgur13_ClientId) - Imgur13_ClientSecret: $(Imgur13_ClientSecret) - Photobucket_ClientId: $(Photobucket_ClientId) - Photobucket_ClientSecret: $(Photobucket_ClientSecret) - Picasa_ClientId: $(Picasa_ClientId) - Picasa_ClientSecret: $(Picasa_ClientSecret) - - - task: CopyFiles@2 - displayName: 'Copy Files to: $(build.artifactstagingdirectory)' - inputs: - SourceFolder: '$(Build.SourcesDirectory)\installer' - Contents: Greenshot-INSTALLER-*.exe - TargetFolder: '$(build.artifactstagingdirectory)' - flattenFolders: true - - - task: PublishBuildArtifacts@1 - displayName: 'Publish Artifact: drop' - inputs: - PathtoPublish: '$(build.artifactstagingdirectory)' - -- stage: Deploy - jobs: - - deployment: GitHub_Release - pool: - vmImage: 'Windows-latest' - - environment: 'GitHub Release' - strategy: - # default deployment strategy - runOnce: - deploy: - steps: - - download: current - artifact: drop - - # Create a GitHub release - - task: GitHubRelease@0 - inputs: - gitHubConnection: GitHub Release - repositoryName: '$(Build.Repository.Name)' - action: 'create' # Options: create, edit, delete - target: '$(Build.SourceVersion)' # Required when action == Create || Action == Edit - tagSource: 'manual' # Required when action == Create# Options: auto, manual - tag: 'v$(Build.BuildNumber)' # Required when action == Edit || Action == Delete || TagSource == Manual - title: Greenshot $(Build.BuildNumber) unstable # Optional - #releaseNotesSource: 'file' # Optional. Options: file, input - #releaseNotesFile: # Optional - #releaseNotes: # Optional - assets: '$(Pipeline.Workspace)/drop/*.exe' - #assetUploadMode: 'delete' # Optional. Options: delete, replace - isDraft: true # Optional - isPreRelease: true # Optional - addChangeLog: true # Optional - #compareWith: 'lastFullRelease' # Required when addChangeLog == True. Options: lastFullRelease, lastRelease, lastReleaseByTag - #releaseTag: # Required when compareWith == LastReleaseByTag diff --git a/build-and-deploy.ps1 b/build-and-deploy.ps1 new file mode 100644 index 000000000..7645259c5 --- /dev/null +++ b/build-and-deploy.ps1 @@ -0,0 +1,149 @@ +# USAGE +# * Enable script execution in Powershell: 'Set-ExecutionPolicy RemoteSigned' +# * Create a GitHub personal access token (PAT) for greenshot repository +# * user must be owner of the repository +# * token needs read and write permissions ""for Contents"" and ""Pages"" +# * Execute the script and paste your token + +# Prompt the user to securely input the Github token +$SecureToken = Read-Host "Please enter your GitHub personal access token" -AsSecureString +$ReleaseToken = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureToken)) + +# Variables +$RepoPath = "." # Replace with your local repo path +$ArtifactsPath = "$RepoPath\artifacts" +$SolutionFile = "$RepoPath\src\Greenshot.sln" + +# Step 0: Update Local Repository +git pull + +# Step 1: Restore NuGet Packages +Write-Host "Restoring NuGet packages..." +msbuild "$SolutionFile" /p:Configuration=Release /restore /t:PrepareForBuild +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to restore NuGet packages." + exit $LASTEXITCODE +} + +# Step 2: Build and Package +Write-Host "Building and packaging the solution..." +msbuild "$SolutionFile" /p:Configuration=Release /t:Rebuild /v:normal +if ($LASTEXITCODE -ne 0) { + Write-Error "Build failed." + exit $LASTEXITCODE +} + +# Step 3: Copy Installer Files +Write-Host "Copying installer files..." +if (-not (Test-Path $ArtifactsPath)) { + New-Item -ItemType Directory -Force -Path $ArtifactsPath +} +Copy-Item "$RepoPath\installer\Greenshot-INSTALLER-*.exe" -Destination $ArtifactsPath -Force +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to copy installer files." + exit $LASTEXITCODE +} + +# Step 4: Extract Version from File Name +Write-Host "Extracting version from installer file name..." +$InstallerFile = Get-ChildItem $ArtifactsPath -Filter "Greenshot-INSTALLER-*.exe" | Select-Object -Last 1 +if (-not $InstallerFile) { + Write-Error "No matching installer file found in '$ArtifactsPath'." + exit 1 +} + +if ($InstallerFile.Name -match "Greenshot-INSTALLER-([\d\.]+).*\.exe") { + $Version = $matches[1] + Write-Host "Extracted version: $Version" +} else { + Write-Error "Version number could not be extracted from file name: $($InstallerFile.Name)" + exit 1 +} + +# Step 5: Create Git Tag +Write-Host "Creating Git tag..." +cd $RepoPath +#git config user.name "local-script" +#git config user.email "local-script@example.com" +git tag -a "v$Version" -m "v$Version" +git push origin "v$Version" +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to create Git tag." + exit $LASTEXITCODE +} + +# Step 6: Create GitHub Release +Write-Host "Creating GitHub release..." +$Headers = @{ + Authorization = "Bearer $ReleaseToken" + Accept = "application/vnd.github+json" +} +$ReleaseData = @{ + tag_name = "v$Version" + name = "Greenshot $Version unstable" + body = "Pre-release of Greenshot $Version." + draft = $true + prerelease = $true + generate_release_notes = $true +} +$ReleaseResponse = Invoke-RestMethod ` + -Uri "https://api.github.com/repos/greenshot/greenshot/releases" ` + -Method POST ` + -Headers $Headers ` + -Body (ConvertTo-Json $ReleaseData -Depth 10) + +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to create GitHub release." + exit $LASTEXITCODE +} + +Write-Host "Release created successfully." + +# Get the release ID from the response +$ReleaseId = $ReleaseResponse.id +Write-Host "Release ID: $ReleaseId" + +# Step 7: Upload .exe File to Release +Write-Host "Uploading .exe file to GitHub release..." +$ExeFilePath = "$ArtifactsPath\$($InstallerFile.Name)" +if (-Not (Test-Path $ExeFilePath)) { + Write-Error "Built .exe file not found: $ExeFilePath" + exit 1 +} + +# GitHub API for uploading release assets +$UploadUrl = $ReleaseResponse.upload_url -replace "{.*}", "" + +# Upload the file +$FileHeaders = @{ + Authorization = "Bearer $ReleaseToken" + ContentType = "application/octet-stream" +} +$FileName = [System.IO.Path]::GetFileName($ExeFilePath) + +Invoke-RestMethod ` + -Uri "$($UploadUrl)?name=$FileName" ` + -Method POST ` + -Headers $FileHeaders ` + -InFile $ExeFilePath ` + -ContentType "application/octet-stream" + +if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to upload .exe file to release." + exit $LASTEXITCODE +} + +Write-Host "File uploaded successfully: $FileName" + +# Step 7: Trigger GitHub Pages Rebuild +#Write-Host "Triggering GitHub Pages rebuild..." +#Invoke-RestMethod ` +# -Uri "https://api.github.com/repos/greenshot/greenshot/pages/builds" ` +# -Method POST ` +# -Headers $Headers +#if ($LASTEXITCODE -ne 0) { +# Write-Error "Failed to trigger GitHub Pages rebuild." +# exit $LASTEXITCODE +#} +# +#Write-Host "GitHub Pages rebuild triggered successfully." \ No newline at end of file diff --git a/installer/additional_files/readme.txt b/installer/additional_files/readme.txt index 1215789b6..bdb64e2c4 100644 --- a/installer/additional_files/readme.txt +++ b/installer/additional_files/readme.txt @@ -7,7 +7,29 @@ CHANGE LOG: All details to our tickets can be found here: https://greenshot.atlassian.net -# Release notes for Greenshot 1.3 +# Greenshot 1.3.xxx + +Bugs fixed: +* greenshot.ini: Exclude Plugins and Include Plugins setting broken [#648](https://github.com/greenshot/greenshot/issues/648) [#642](https://github.com/greenshot/greenshot/issues/642) thanks to @Christian-Schulz for providing the fix + +Features added: + +# Greenshot 1.3.296 + +Bugs fixed +* Fix Administrative installation via user interface [#546](https://github.com/greenshot/greenshot/issues/546) [#611](https://github.com/greenshot/greenshot/issues/611) [#598](https://github.com/greenshot/greenshot/issues/598) + +Features added: +* Installer: Allow Choice between All-Users (Administrative) and Current-User Installation [#625](https://github.com/greenshot/greenshot/pull/625) + +# Greenshot 1.3.292 + +Bugs fixed: +* Fix Administrative installation via command line using /ALLUSERS [#601](https://github.com/greenshot/greenshot/issues/601) [#619](https://github.com/greenshot/greenshot/issues/619) + +# Greenshot 1.3.290 + +Note: the version information for the first 1.3 release is outdated/incomplete. Due to the long timespan and large amount of changes between 1.2 and 1.3 we lost track. Sorry. Greenshot 1.3 is the first Greenshot which targets .NET 4.7.2 which just by doing to solves some general issues in the area of Internet Explorer capturing, TLS communication and some other minor issues. @@ -646,3 +668,5 @@ Features added: * when clicking two overlapping elements, the one created later gets selected [ 1725175 ] * created textboxes can now be edited with a doubleclick [ 1704408 ] * selected font is now stored in the application config file [ 1704411 ] + + diff --git a/installer/innosetup/Languages/Arabic.isl b/installer/innosetup/Languages/Arabic.isl index cc25fe2cd..03f29258d 100644 --- a/installer/innosetup/Languages/Arabic.isl +++ b/installer/innosetup/Languages/Arabic.isl @@ -1,4 +1,4 @@ -; *** Inno Setup version 6.0.3+ arabic messages *** +; *** Inno Setup version 6.1.0+ arabic messages *** ; ; Translated by nacer baaziz (nacerstile@gmail.com) ; http://www.jrsoftware.org/files/istrans/ @@ -14,6 +14,7 @@ LanguageName=arabic LanguageID=$0401 LanguageCodePage=0 +RightToLeft=yes ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= @@ -70,8 +71,8 @@ PrivilegesRequiredOverrideText1=يمكن ل %1 أن يُثَبَّت على جم PrivilegesRequiredOverrideText2=.يمكن ل %1 أن يُثَبَّت لك فقط, أو أن يُثَبَّت على جميع المستخدمين (يتطلب إمتيازات المسؤول). PrivilegesRequiredOverrideAllUsers=التثبيت ل&كافة المستخدمين PrivilegesRequiredOverrideAllUsersRecommended=تثبيت ل&كافة المستخدمين (مستحسن) -PrivilegesRequiredOverrideCurrentUser=تثبيت &لي فقط -PrivilegesRequiredOverrideCurrentUserRecommended=تثبيت بالنسبة &لي فقط (مستحسن) +PrivilegesRequiredOverrideCurrentUser=تثبيت لي &فقط +PrivilegesRequiredOverrideCurrentUserRecommended=تثبيت بالنسبة لي &فقط (مستحسن) ; *** Misc. errors ErrorCreatingDir=تعذر على برنامج الإعداد إنشاء الدليل "%1" @@ -210,6 +211,18 @@ ReadyMemoComponents=المكونات المحددة: ReadyMemoGroup=مجلد قائمة ابدأ: ReadyMemoTasks=مهام إضافية: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=تحميل الملفات الإضافية... +ButtonStopDownload=إي&قاف التحميل +StopDownload=هل أنت متأكد من أنك ترغب في إيقاف التحميل؟ +ErrorDownloadAborted=تم إلغاء التحميل +ErrorDownloadFailed=فشل التحميل: %1 %2 +ErrorDownloadSizeFailed=خطأ في قراءة الحجم: %1 %2 +ErrorFileHash1=خطأ في قراءة الهاش الخاص بالملف: %1 +ErrorFileHash2=خطأ في هاش الملف: كان من المتوقع أن يكن : %1, بينما تم إيجاد : %2 +ErrorProgress=خطأ في الحصول على نسبة التقدم: %1 من %2 +ErrorFileSize=خطأ في حجم الملف: المتوقع هو : %1, الحجم الذي وجدناه هو : %2 + ; *** "Preparing to Install" wizard page WizardPreparing=التحضير للتثبيت PreparingDesc=الإعداد يستعد لتثبيت [name] على جهازك. @@ -292,8 +305,16 @@ ExistingFileReadOnly2=تعذر استبدال الملف الموجود لأنه ExistingFileReadOnlyRetry=&أزل القراءة فقط عن الملفات ثم حاول مرة أخرى ExistingFileReadOnlyKeepExisting=&إحتفظ بالملفات الموجودة ErrorReadingExistingDest=حدث خطأ أثناء محاولة قراءة الملف الموجود: -FileExists=الملف موجود مسبقاً.%n%nهل تريد لبرنامج الإعداد أن يكتب استبداله؟ -ExistingFileNewer=الملف الموجود أحدث من الذي يحاول الإعداد تثبيته. من المستحسن الاحتفاظ بالملف الموجود.%n%nهل تريد الاحتفاظ بالملف الموجود؟ +FileExistsSelectAction=اختر إجراء +FileExists2=الملف موجود بالفعل. +FileExistsOverwriteExisting=&استبدال الملف الموجود +FileExistsKeepExisting=ا&بقاء الملف الموجود +FileExistsOverwriteOrKeepAll=ا&فعل هذا للنزاعات القادمة +ExistingFileNewerSelectAction=اختر إجراء +ExistingFileNewer2=الملف الموجود أحدث من الملف الذي سيقوم معالج الإعداد بتثبيته. +ExistingFileNewerOverwriteExisting=&&استبدال الملف الموجود +ExistingFileNewerKeepExisting=ال&ابقاء على الملف الموجود (مستحسن) +ExistingFileNewerOverwriteOrKeepAll=ا&فعل هذا مع النزاعات القادمة ErrorChangingAttr=حدث خطأ أثناء محاولة تغيير سمات الملف الموجود: ErrorCreatingTemp=حدث خطأ أثناء محاولة إنشاء ملف في الدليل الوجهة: ErrorReadingSource=حدث خطأ أثناء محاولة قراءة ملف مصدر: diff --git a/installer/innosetup/Languages/Armenian.isl b/installer/innosetup/Languages/Armenian.isl new file mode 100644 index 000000000..148db9559 --- /dev/null +++ b/installer/innosetup/Languages/Armenian.isl @@ -0,0 +1,376 @@ +; *** Inno Setup version 6.1.0+ Armenian messages *** +; +; Armenian translation by Hrant Ohanyan +; E-mail: h.ohanyan@haysoft.org +; Translation home page: http://www.haysoft.org +; Last modification date: 2020-10-06 +; +[LangOptions] +LanguageName=Հայերեն +LanguageID=$042B +LanguageCodePage=0 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Տեղադրում +SetupWindowTitle=%1-ի տեղադրում +UninstallAppTitle=Ապատեղադրում +UninstallAppFullTitle=%1-ի ապատեղադրում + +; *** Misc. common +InformationTitle=Տեղեկություն +ConfirmTitle=Հաստատել +ErrorTitle=Սխալ + +; *** SetupLdr messages +SetupLdrStartupMessage=Այս ծրագիրը կտեղադրի %1-ը Ձեր համակարգչում։ Շարունակե՞լ։ +LdrCannotCreateTemp=Հնարավոր չէ ստեղծել ժամանակավոր ֆայլ։ Տեղադրումը կասեցված է +LdrCannotExecTemp=Հնարավոր չէ կատարել ֆայլը ժամանակավոր պանակից։ Տեղադրումը կասեցված է + +; *** Startup error messages +LastErrorMessage=%1.%n%nՍխալ %2: %3 +SetupFileMissing=%1 ֆայլը բացակայում է տեղադրման պանակից։ Ուղղեք խնդիրը կամ ստացեք ծրագրի նոր տարբերակը։ +SetupFileCorrupt=Տեղադրվող ֆայլերը վնասված են։ +SetupFileCorruptOrWrongVer=Տեղադրվող ֆայլերը վնասված են կամ անհամատեղելի են տեղակայիչի այս տարբերակի հետ։ Ուղղեք խնդիրը կամ ստացեք ծրագրի նոր տարբերակը։ +InvalidParameter=Հրամանատողում նշված է սխալ հրաման.%n%n%1 +SetupAlreadyRunning=Տեղակայիչը արդեն աշխատեցված է։ +WindowsVersionNotSupported=Ծրագիրը չի աջակցում այս համակարգչում աշխատող Windows-ի տարբերակը։ +WindowsServicePackRequired=Ծրագիրը պահանջում է %1-ի Service Pack %2 կամ ավելի նոր։ +NotOnThisPlatform=Այս ծրագիրը չի աշխատի %1-ում։ +OnlyOnThisPlatform=Այս ծրագիրը հնարավոր է բացել միայն %1-ում։ +OnlyOnTheseArchitectures=Այս ծրագրի տեղադրումը հնարավոր է միայն Windows-ի մշակիչի հետևյալ կառուցվածքներում՝ %n%n%1 +WinVersionTooLowError=Այս ծրագիրը պահանջում է %1-ի տարբերակ %2 կամ ավելի նորը։ +WinVersionTooHighError=Ծրագիրը չի կարող տեղադրվել %1-ի տարբերակ %2 կամ ավելի նորում +AdminPrivilegesRequired=Ծրագիրը տեղադրելու համար պահանջվում են Վարիչի իրավունքներ։ +PowerUserPrivilegesRequired=Ծրագիրը տեղադրելու համար պետք է մուտք գործել համակարգ որպես Վարիչ կամ «Փորձառու օգտագործող» (Power Users): +SetupAppRunningError=Տեղակայիչը հայտնաբերել է, որ %1-ը աշխատում է։%n%nՓակեք այն և սեղմեք «Լավ»՝ շարունակելու համար կամ «Չեղարկել»՝ փակելու համար։ +UninstallAppRunningError=Ապատեղադրող ծրագիրը հայտնաբերել է, որ %1-ը աշխատում է։%n%nՓակեք այն և սեղմեք «Լավ»՝ շարունակելու համար կամ «Չեղարկել»՝ փակելու համար։ + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Ընտրեք տեղակայիչի տեղադրման կերպը +PrivilegesRequiredOverrideInstruction=Ընտրեք տեղադրման կերպը +PrivilegesRequiredOverrideText1=%1-ը կարող է տեղադրվել բոլոր օգտվողների համար (պահանջում է վարիչի արտոնություններ) կամ միայն ձեզ համար: +PrivilegesRequiredOverrideText2=%1-ը կարող է տեղադրվել միայն ձեզ համար կամ բոլոր օգտվողների համար (պահանջում է վարիչի արտոնություններ): +PrivilegesRequiredOverrideAllUsers=Տեղադրել &բոլոր օգտվողների համար +PrivilegesRequiredOverrideAllUsersRecommended=Տեղադրել &բոլոր օգտվողների համար (հանձնարարելի) +PrivilegesRequiredOverrideCurrentUser=Տեղադրել միայն &ինձ համար +PrivilegesRequiredOverrideCurrentUserRecommended=Տեղադրել միայն &ինձ համար (հանձնարարելի) + +; *** Misc. errors +ErrorCreatingDir=Հնարավոր չէ ստեղծել "%1" պանակը +ErrorTooManyFilesInDir=Հնարավոր չէ ստեղծել ֆայլ "%1" պանակում, որովհետև նրանում կան չափից ավելի շատ ֆայլեր + +; *** Setup common messages +ExitSetupTitle=Տեղակայման ընդհատում +ExitSetupMessage=Տեղակայումը չի ավարատվել։ Եթե ընդհատեք, ապա ծրագիրը չի տեղադրվի։%n%nԱվարտե՞լ։ +AboutSetupMenuItem=&Ծրագրի մասին... +AboutSetupTitle=Ծրագրի մասին +AboutSetupMessage=%1, տարբերակ՝ %2%n%3%n%nՎեբ կայք՝ %1:%n%4 +AboutSetupNote= +TranslatorNote=Armenian translation by Hrant Ohanyan »»» http://www.haysoft.org + +; *** Buttons +ButtonBack=« &Նախորդ +ButtonNext=&Հաջորդ » +ButtonInstall=&Տեղադրել +ButtonOK=Լավ +ButtonCancel=Չեղարկել +ButtonYes=&Այո +ButtonYesToAll=Այո բոլորի &համար +ButtonNo=&Ոչ +ButtonNoToAll=Ո&չ բոլորի համար +ButtonFinish=&Ավարտել +ButtonBrowse=&Ընտրել... +ButtonWizardBrowse=&Ընտրել... +ButtonNewFolder=&Ստեղծել պանակ + +; *** "Select Language" dialog messages +SelectLanguageTitle=Ընտրել տեղակայիչի լեզուն +SelectLanguageLabel=Ընտրեք այն լեզուն, որը օգտագործվելու է տեղադրման ընթացքում: + +; *** Common wizard text +ClickNext=Սեղմեք «Հաջորդ»՝ շարունակելու համար կամ «Չեղարկել»՝ տեղակայիչը փակելու համար։ +BeveledLabel= +BrowseDialogTitle=Ընտրել պանակ +BrowseDialogLabel=Ընտրեք պանակը ցանկից և սեղմեք «Լավ»։ +NewFolderName=Նոր պանակ + +; *** "Welcome" wizard page +WelcomeLabel1=Ձեզ ողջունում է [name]-ի տեղակայման օգնականը +WelcomeLabel2=Ծրագիրը կտեղադրի [name/ver]-ը Ձեր համակարգչում։%n%nՇարունակելուց առաջ խորհուրդ ենք տալիս փակել բոլոր աշխատող ծրագրերը։ + +; *** "Password" wizard page +WizardPassword=Գաղտնաբառ +PasswordLabel1=Ծրագիրը պաշտպանված է գաղտնաբառով։ +PasswordLabel3=Մուտքագրեք գաղտնաբառը և սեղմեք «Հաջորդ»։ +PasswordEditLabel=&Գաղտնաբառ. +IncorrectPassword=Մուտքագրված գաղտնաբառը սխալ է, կրկին փորձեք։ + +; *** "License Agreement" wizard page +WizardLicense=Արտոնագրային համաձայնագիր +LicenseLabel=Խնդրում ենք շարունակելուց առաջ կարդալ հետևյալ տեղեկությունը։ +LicenseLabel3=Կարդացեք արտոնագրային համաձայնագիրը։ Շարունակելուց առաջ պետք է ընդունեք նշված պայմանները։ +LicenseAccepted=&Ընդունում եմ արտոնագրային համաձայնագիրը +LicenseNotAccepted=&Չեմ ընդունում արտոնագրային համաձայնագիրը + +; *** "Information" wizard pages +WizardInfoBefore=Տեղեկություն +InfoBeforeLabel=Շարունակելուց առաջ կարդացեք այս տեղեկությունը։ +InfoBeforeClickLabel=Եթե պատրաստ եք սեղմեք «Հաջորդը»։ +WizardInfoAfter=Տեղեկություն +InfoAfterLabel=Շարունակելուց առաջ կարդացեք այս տեղեկությունը։ +InfoAfterClickLabel=Երբ պատրաստ լինեք շարունակելու՝ սեղմեք «Հաջորդ»։ + +; *** "User Information" wizard page +WizardUserInfo=Տեղեկություն օգտվողի մասին +UserInfoDesc=Գրեք տվյալներ Ձեր մասին +UserInfoName=&Օգտվողի անուն և ազգանուն. +UserInfoOrg=&Կազմակերպություն. +UserInfoSerial=&Հերթական համար. +UserInfoNameRequired=Պետք է գրեք Ձեր անունը։ + +; *** "Select Destination Location" wizard page +WizardSelectDir=Ընտրել տեղակադրման պանակը +SelectDirDesc=Ո՞ր պանակում տեղադրել [name]-ը։ +SelectDirLabel3=Ծրագիրը կտեղադրի [name]-ը հետևյալ պանակում։ +SelectDirBrowseLabel=Սեղմեք «Հաջորդ»՝ շարունակելու համար։ Եթե ցանկանում եք ընտրել այլ պանակ՝ սեղմեք «Ընտրել»։ +DiskSpaceGBLabel=Առնվազն [gb] ԳԲ ազատ տեղ է պահանջվում: +DiskSpaceMBLabel=Առնվազն [mb] ՄԲ ազատ տեղ է պահանջվում: +CannotInstallToNetworkDrive=Հնարավոր չէ տեղադրել Ցանցային հիշասարքում։ +CannotInstallToUNCPath=Հնարավոր չէ տեղադրել UNC ուղիում։ +InvalidPath=Պետք է նշեք ամբողջական ուղին՝ հիշասարքի տառով, օրինակ՝%n%nC:\APP%n%nկամ UNC ուղի՝ %n%n\\սպասարկիչի_անունը\ռեսուրսի_անունը +InvalidDrive=Ընտրված հիշասարքը կամ ցանցային ուղին գոյություն չունեն կամ անհասանելի են։ Ընտրեք այլ ուղի։ +DiskSpaceWarningTitle=Չկա պահանջվող չափով ազատ տեղ +DiskSpaceWarning=Առնվազն %1 ԿԲ ազատ տեղ է պահանջվում, մինչդեռ հասանելի է ընդամենը %2 ԿԲ։%n%nԱյնուհանդերձ, շարունակե՞լ։ +DirNameTooLong=Պանակի անունը կամ ուղին երկար են: +InvalidDirName=Պանակի նշված անունը անընդունելի է։ +BadDirName32=Անվան մեջ չպետք է լինեն հետևյալ գրանշանները՝ %n%n%1 +DirExistsTitle=Թղթապանակը գոյություն ունի +DirExists=%n%n%1%n%n պանակը արդեն գոյություն ունի։ Այնուհանդերձ, տեղադրե՞լ այստեղ։ +DirDoesntExistTitle=Պանակ գոյություն չունի +DirDoesntExist=%n%n%1%n%n պանակը գոյություն չունի։ Ստեղծե՞լ այն։ + +; *** "Select Components" wizard page +WizardSelectComponents=Ընտրել բաղադրիչներ +SelectComponentsDesc=Ո՞ր ֆայլերը պետք է տեղադրվեն։ +SelectComponentsLabel2=Նշեք այն ֆայլերը, որոնք պետք է տեղադրվեն, ապանշեք նրանք, որոնք չպետք է տեղադրվեն։ Սեղմեք «Հաջորդ»՝ շարունակելու համար։ +FullInstallation=Լրիվ տեղադրում +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Սեղմված տեղադրում +CustomInstallation=Ընտրովի տեղադրում +NoUninstallWarningTitle=Տեղակայվող ֆայլերը +NoUninstallWarning=Տեղակայիչ ծրագիրը հայտնաբերել է, որ հետևյալ բաղադրիչները արդեն տեղադրված են Ձեր համակարգչում։ %n%n%1%n%nԱյս բաղադրիչների ընտրության վերակայումը չի ջնջի դրանք։%n%nՇարունակե՞լ։ +ComponentSize1=%1 ԿԲ +ComponentSize2=%1 ՄԲ +ComponentsDiskSpaceGBLabel=Ընթացիկ ընտրումը պահանջում է առնվազն [gb] ԳԲ տեղ հիշասարքում: +ComponentsDiskSpaceMBLabel=Տվյալ ընտրությունը պահանջում է ամենաքիչը [mb] ՄԲ տեղ հիշասարքում: + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Լրացուցիչ առաջադրանքներ +SelectTasksDesc=Ի՞նչ լրացուցիչ առաջադրանքներ պետք է կատարվեն։ +SelectTasksLabel2=Ընտրեք լրացուցիչ առաջադրանքներ, որոնք պետք է կատարվեն [name]-ի տեղադրման ընթացքում, ապա սեղմեք «Հաջորդ». + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Ընտրել «Մեկնարկ» ցանկի պանակը +SelectStartMenuFolderDesc=Որտե՞ղ ստեղծել դյուրանցումներ. +SelectStartMenuFolderLabel3=Ծրագիրը կստեղծի դյուրանցումներ «Մեկնարկ» ցանկի հետևյալ պանակում։ +SelectStartMenuFolderBrowseLabel=Սեղմեք «Հաջորդ»՝ շարունակելու համար։ Եթե ցանկանում եք ընտրեք այլ պանակ՝ սեղմեք «Ընտրել»։ +MustEnterGroupName=Պետք է գրել պանակի անունը։ +GroupNameTooLong=Պանակի անունը կամ ուղին շատ երկար են։ +InvalidGroupName=Նշված անունը անընդունելի է։ +BadGroupName=Անվան մեջ չպետք է լինեն հետևյալ գրանշանները՝ %n%n%1 +NoProgramGroupCheck2=&Չստեղծել պանակ «Մեկնարկ» ցանկում + +; *** "Ready to Install" wizard page +WizardReady=Պատրաստ է +ReadyLabel1=Տեղակայիչը պատրաստ է սկսել [name]-ի տեղադրումը։ +ReadyLabel2a=Սեղմեք «Տեղադրել»՝ շարունակելու համար կամ «Նախորդ»՝ եթե ցանկանում եք դիտել կամ փոփոխել տեղադրելու կարգավորումները։ +ReadyLabel2b=Սեղմեք «Տեղադրել»՝ շարունակելու համար։ +ReadyMemoUserInfo=Տեղեկություն օգտվողի մասին. +ReadyMemoDir=Տեղադրելու պանակ. +ReadyMemoType=Տեղադրման ձև. +ReadyMemoComponents=Ընտրված բաղադրիչներ. +ReadyMemoGroup=Թղթապանակ «Մեկնարկ» ցանկում. +ReadyMemoTasks=Լրացուցիչ առաջադրանքներ. +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Լրացուցիչ ֆայլերի ներբեռնում... +ButtonStopDownload=&Կանգնեցնել ներբեռնումը +StopDownload=Համոզվա՞ծ եք, որ պետք է կանգնեցնել ներբեռնումը: +ErrorDownloadAborted=Ներբեռնումը կասեցված է +ErrorDownloadFailed=Ներբեռնումը ձախողվեց. %1 %2 +ErrorDownloadSizeFailed=Չափի ստացումը ձախողվեց. %1 %2 +ErrorFileHash1=Ֆահլի հաշվեգումարը ձախողվեց. %1 +ErrorFileHash2=Ֆայլի անվավեր հաշվեգումար. ակընկալվում էր %1, գտնվել է %2 +ErrorProgress=Անվավեր ընթացք. %1-ը %2-ից +ErrorFileSize=Ֆայլի անվավեր աչփ. ակընկալվում էր %1, գտնվել է %2 +; *** "Preparing to Install" wizard page +WizardPreparing=Նախատրաստում է տեղադրումը +PreparingDesc=Տեղակայիչը պատրաստվում է տեղադրել [name]-ը ձեր համակարգչում։ +PreviousInstallNotCompleted=Այլ ծրագրի տեղադրումը կամ ապատեղադրումը չի ավարտվել։ Այն ավարտելու համար պետք է վերամեկնարկեք համակարգիչը։%n%nՎերամեկնարկելուց հետո կրկին բացեք տեղակայման փաթեթը՝ [name]-ի տեղադրումը ավարտելու համար։ +CannotContinue=Հնարավոր չէ շարունակել։ Սեղմեք «Չեղարկել»՝ ծրագիրը փակելու համար։ +ApplicationsFound=Հետևյալ ծրագրերը օգտագործում են ֆայլեր, որոնք պետք է թարմացվեն տեղակայիչի կողմից։ Թույլատրեք տեղակայիչին ինքնաբար փակելու այդ ծրագրերը։ +ApplicationsFound2=Հետևյալ ծրագրերը օգտագործում են ֆայլեր, որոնք պետք է թարմացվեն տեղակայիչի կողմից։ Թույլատրեք տեղակայիչին ինքնաբար փակելու այդ ծրագրերը։ Տեղադրումը ավարտելուց հետո տեղակայիչը կփորձի վերամեկնարկել այդ ծրագրերը։ +CloseApplications=&Ինքնաբար փակել ծրագրերը +DontCloseApplications=&Չփակել ծրագրերը +ErrorCloseApplications=Տեղակայիչը չկարողացավ ինքնաբար փակել բոլոր ծրագրերը: Խորհուրդ ենք տալիս փակել այն բոլոր ծրագրերը, որոնք պետք է թարմացվեն տեղակայիչի կողմից: +PrepareToInstallNeedsRestart=Տեղակայիչը պետք է վերամեկնարկի ձեր համակարգիչը: Դրանից հետո կրկին աշխատեցրեք այն՝ ավարտելու համար [name]-ի տեղադրումը:%n%nՑանկանո՞ւմ եք վերամեկնարկել հիմա: + +; *** "Installing" wizard page +WizardInstalling=Տեղադրում +InstallingLabel=Խնդրում ենք սպասել մինչ [name]-ը կտեղադրվի Ձեր համակարգչում։ + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=[name]-ի տեղադրման ավարտ +FinishedLabelNoIcons=[name] ծրագիրը տեղադրվել է Ձեր համակարգչում։ +FinishedLabel=[name] ծրագիրը տեղադրվել է Ձեր համակարգչում։ +ClickFinish=Սեղմեք «Ավարտել»՝ տեղակայիչը փակելու համար։ +FinishedRestartLabel=[name]-ի տեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։ վերամեկնարկե՞լ հիմա։ +FinishedRestartMessage=[name]-ի տեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։ %n%վերամեկնարկե՞լ հիմա։ +ShowReadmeCheck=Նայել README ֆայլը։ +YesRadio=&Այո, վերամեկնարկել +NoRadio=&Ոչ, ես հետո վերամեկնարկեմ +; used for example as 'Run MyProg.exe' +RunEntryExec=Աշխատեցնել %1-ը +; used for example as 'View Readme.txt' +RunEntryShellExec=Նայել %1-ը + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Տեղակայիչը պահանջում է հաջորդ սկավառակը +SelectDiskLabel2=Զետեղեք %1 սկավառակը և սեղմեք «Լավ»։ %n%nԵթե ֆայլերի պանակը գտնվում է այլ տեղ, ապա ընտրեք ճիշտ ուղին կամ սեղմեք «Ընտրել»։ +PathLabel=&Ուղին. +FileNotInDir2="%1" ֆայլը չի գտնվել "%2"-ում։ Զետեղեք ճիշտ սկավառակ կամ ընտրեք այլ պանակ։ +SelectDirectoryLabel=Խնդրում ենք նշել հաջորդ սկավառակի տեղադրությունը։ + +; *** Installation phase messages +SetupAborted=Տեղակայումը չի ավարտվել։ %n%nՈւղղեք խնդիրը և կրկին փորձեք։ +AbortRetryIgnoreSelectAction=Ընտրեք գործողություն +AbortRetryIgnoreRetry=&Կրկին փորձել +AbortRetryIgnoreIgnore=&Անտեսել սխալը և շարունակել +AbortRetryIgnoreCancel=Չեղարկել տեղադրումը + +; *** Installation status messages +StatusClosingApplications=Փակում է ծրագրերը... +StatusCreateDirs=Պանակների ստեղծում... +StatusExtractFiles=Ֆայլերի դուրս բերում... +StatusCreateIcons=Դյուրանցումների ստեղծում... +StatusCreateIniEntries=INI ֆայլերի ստեղծում... +StatusCreateRegistryEntries=Գրանցամատյանի գրանցումների ստեղծում... +StatusRegisterFiles=Ֆայլերի գրանցում... +StatusSavingUninstall=Ապատեղադրելու տեղեկության պահում... +StatusRunProgram=Տեղադրելու ավարտ... +StatusRestartingApplications=Ծրագրերի վերամեկնարկում... +StatusRollback=Փոփոխությունների հետ բերում... + +; *** Misc. errors +ErrorInternal2=Ներքին սխալ %1 +ErrorFunctionFailedNoCode=%1. վթար +ErrorFunctionFailed=%1. վթար, կոդը՝ %2 +ErrorFunctionFailedWithMessage=%1. վթար, կոդը՝ %2.%n%3 +ErrorExecutingProgram=Հնարավոր չէ կատարել %n%1 ֆայլը + +; *** Registry errors +ErrorRegOpenKey=Գրանցամատյանի բանալին բացելու սխալ՝ %n%1\%2 +ErrorRegCreateKey=Գրանցամատյանի բանալին ստեղծելու սխալ՝ %n%1\%2 +ErrorRegWriteKey=Գրանցամատյանի բանալիում գրանցում կատարելու սխալ՝ %n%1\%2 + +; *** INI errors +ErrorIniEntry=Սխալ՝ "%1" INI ֆայլում գրառում կատարելիս։ + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=Բաց թողնել այս ֆայլը (խորհուրդ չի տրվում) +FileAbortRetryIgnoreIgnoreNotRecommended=Անտեսել սխալը և շարունակել (խորհուրդ չի տրվում) +SourceIsCorrupted=Սկզբնական ֆայլը վնասված է։ +SourceDoesntExist=Սկզբնական "%1" ֆայլը գոյություն չունի +ExistingFileReadOnly2=Առկա ֆայլը չի կարող փոխարինվել, քանի որ այն նշված է որպես միայն կարդալու: +ExistingFileReadOnlyRetry=&Հեռացրեք միայն կարդալ հատկանիշը և կրկին փորձեք +ExistingFileReadOnlyKeepExisting=&Պահել առկա ֆայլը +ErrorReadingExistingDest=Սխալ՝ ֆայլը կարդալիս. +FileExistsSelectAction=Ընտրեք գործողություն +FileExists2=Ֆայլը գոյություն չունի +FileExistsOverwriteExisting=&Վրագրել առկա ֆայլը +FileExistsKeepExisting=&Պահել առկա ֆայլը +FileExistsOverwriteOrKeepAll=&Անել սա հաջորդ բախման ժամանակ +ExistingFileNewerSelectAction=Ընտրեք գործողություն +ExistingFileNewer2=Առկա ֆայլը ավելի նոր է, քան այն, որ տեղակայիչը փորձում է տեղադրել: +ExistingFileNewerOverwriteExisting=&Վրագրել առկա ֆայլը +ExistingFileNewerKeepExisting=&Պահել առկա ֆայլը (հանձնարարելի) +ExistingFileNewerOverwriteOrKeepAll=&Անել սա հաջորդ բախման ժամանակ +ErrorChangingAttr=Սխալ՝ ընթացիկ ֆայլի հատկանիշները փոխելիս. +ErrorCreatingTemp=Սխալ՝ նշված պանակում ֆայլ ստեղծելիս. +ErrorReadingSource=Սխալ՝ ֆայլը կարդալիս. +ErrorCopying=Սխալ՝ ֆայլը պատճենելիս. +ErrorReplacingExistingFile=Սխալ՝ գոյություն ունեցող ֆայլը փոխարինելիս. +ErrorRestartReplace=RestartReplace ձախողում. +ErrorRenamingTemp=Սխալ՝ նպատակակետ պանակում՝ ֆայլը վերանվանելիս. +ErrorRegisterServer=Հնարավոր չէ գրանցել DLL/OCX-ը. %1 +ErrorRegSvr32Failed=RegSvr32-ի ձախողում, կոդ՝ %1 +ErrorRegisterTypeLib=Հնարավոր չէ գրանցել դարանները՝ %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 բիթային +UninstallDisplayNameMark64Bit=64 բիթային +UninstallDisplayNameMarkAllUsers=Բոլոր օգտվողները +UninstallDisplayNameMarkCurrentUser=Ընթացիկ օգտվողը + +; *** Post-installation errors +ErrorOpeningReadme=Սխալ՝ README ֆայլը բացելիս։ +ErrorRestartingComputer=Հնարավոր չեղավ վերամեկնարկել համակարգիչը։ Ինքներդ փորձեք։ + +; *** Uninstaller messages +UninstallNotFound="%1" ֆայլը գոյություն չունի։ Հնարավոր չէ ապատեղադրել։ +UninstallOpenError="%1" ֆայլը հնարավոր չէ բացել: Հնարավոր չէ ապատեղադրել +UninstallUnsupportedVer=Ապատեղադրելու "%1" մատյանի ֆայլը անճանաչելի է ապատեղադրող ծրագրի այս տարբերակի համար։ Հնարավոր չէ ապատեղադրել +UninstallUnknownEntry=Անհայտ գրառում է (%1)՝ հայնաբերվել ապատեղադրելու մատյանում +ConfirmUninstall=Ապատեղադրե՞լ %1-ը և նրա բոլոր բաղադրիչները։ +UninstallOnlyOnWin64=Հնարավոր է ապատեղադրել միայն 64 բիթանոց Windows-ում։ +OnlyAdminCanUninstall=Հնարավոր է ապատեղադրել միայն Ադմինի իրավունքներով։ +UninstallStatusLabel=Խնդրում ենք սպասել, մինչև %1-ը ապատեղադրվում է Ձեր համակարգչից։ +UninstalledAll=%1 ծրագիրը ապատեղադրվել է համակարգչից։ +UninstalledMost=%1-ը ապատեղադրվեց Ձեր համակարգչից։%n%nՈրոշ ֆայլեր հնարավոր չեղավ հեռացնել։ Ինքներդ հեռացրեք դրանք։ +UninstalledAndNeedsRestart=%1-ի ապատեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։%n%nՎերամեկնարկե՞լ։ +UninstallDataCorrupted="%1" ֆայլը վնասված է։ Հնարավոր չէ ապատեղադրել + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Հեռացնե՞լ համատեղ օգտագործվող ֆայլը։ +ConfirmDeleteSharedFile2=Համակարգը նշում է, որ հետևյալ համատեղ օգտագործվող ֆայլը այլևս չի օգտագործվում այլ ծրագրի կողմից։ Ապատեղադրե՞լ այն։ %n%nԵթե համոզված չեք սեղմեք «Ոչ»։ +SharedFileNameLabel=Ֆայլի անուն. +SharedFileLocationLabel=Տեղադրություն. +WizardUninstalling=Ապատեղադրելու վիճակ +StatusUninstalling=%1-ի ապատեղադրում... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=%1-ի տեղադրում։ +ShutdownBlockReasonUninstallingApp=%1-ի ապատեղադրում։ + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 տարբերակ՝ %2 +AdditionalIcons=Լրացուցիչ դյուրանցումներ +CreateDesktopIcon=Ստեղծել դյուրանցում &Աշխատասեղանին +CreateQuickLaunchIcon=Ստեղծել դյուրանցում &Արագ թողարկման գոտում +ProgramOnTheWeb=%1-ի վեբ կայքը +UninstallProgram=%1-ի ապատեղադրում +LaunchProgram=Բացել %1-ը +AssocFileExtension=Հա&մակցել %1-ը %2 ֆայլերի հետ։ +AssocingFileExtension=%1-ը համակցվում է %2 ընդլայնումով ֆայլերի հետ... +AutoStartProgramGroupDescription=Ինքնամեկնարկ. +AutoStartProgram=Ինքնաբար մեկնարկել %1-ը +AddonHostProgramNotFound=%1 չի կարող տեղադրվել Ձեր ընտրած պանակում։%n%nՇարունակե՞լ։ + diff --git a/installer/innosetup/Languages/Bosnian.isl b/installer/innosetup/Languages/Bosnian.isl index 93488c918..d3080c044 100644 --- a/installer/innosetup/Languages/Bosnian.isl +++ b/installer/innosetup/Languages/Bosnian.isl @@ -1,9 +1,18 @@ -; *** Inno Setup version 5.5.3+ Bosnian messages *** +; *** Inno Setup version 6.1.0+ Bosnian messages *** +; Translated by: Almedin Maleškić (malmedin@gmail.com) +; Based on translation by Kenan Dervisevic (kenan3008@gmail.com) ; -; Bosnian translation by Kenan Dervisevic (kenan3008@gmail.com) +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ ; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). [LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. LanguageName=Bosanski LanguageID=$141a LanguageCodePage=1250 @@ -29,43 +38,53 @@ UninstallAppFullTitle=%1 Deinstalacija ; *** Misc. common InformationTitle=Informacija ConfirmTitle=Potvrda -ErrorTitle=Greka +ErrorTitle=Greška ; *** SetupLdr messages -SetupLdrStartupMessage=Zapoeli ste instalaciju programa %1. elite li nastaviti? +SetupLdrStartupMessage=Započeli ste instalaciju programa %1. Želite li nastaviti? LdrCannotCreateTemp=Ne mogu kreirati privremenu datoteku. Instalacija prekinuta -LdrCannotExecTemp=Ne mogu izvriti datoteku u privremenom folderu. Instalacija prekinuta +LdrCannotExecTemp=Ne mogu izvršiti datoteku u privremenom folderu. Instalacija prekinuta +HelpTextNote= ; *** Startup error messages -LastErrorMessage=%1.%n%nGreka %2: %3 -SetupFileMissing=Datoteka %1 se ne nalazi u instalacijskom folderu. Molimo vas da rijeite problem ili nabavite novu kopiju programa. -SetupFileCorrupt=Instalacijske datoteke sadre greku. Molimo vas da nabavite novu kopiju programa. -SetupFileCorruptOrWrongVer=Instalacijske datoteke sadre greku, ili nisu kompatibilne sa ovom verzijom instalacije. Molimo vas rijeite problem ili nabavite novu kopiju programa. -InvalidParameter=Neispravan parametar je proslijeen komandnoj liniji:%n%n%1 -SetupAlreadyRunning=Instalacija je ve pokrenuta. -WindowsVersionNotSupported=Ovaj program ne podrava verziju Windowsa koja je instalirana na ovom raunaru. +LastErrorMessage=%1.%n%nGreška %2: %3 +SetupFileMissing=Datoteka %1 se ne nalazi u instalacijskom folderu. Molimo vas da riješite problem ili nabavite novu kopiju programa. +SetupFileCorrupt=Instalacijske datoteke sadrže grešku. Molimo vas da nabavite novu kopiju programa. +SetupFileCorruptOrWrongVer=Instalacijske datoteke sadrže grešku, ili nisu kompatibilne sa ovom verzijom instalacije. Molimo vas riješite problem ili nabavite novu kopiju programa. +InvalidParameter=Neispravan parametar je proslijeđen komandnoj liniji:%n%n%1 +SetupAlreadyRunning=Instalacija je već pokrenuta. +WindowsVersionNotSupported=Ovaj program ne podržava verziju Windowsa koja je instalirana na ovom računaru. WindowsServicePackRequired=Ovaj program zahtjeva %1 Service Pack %2 ili noviji. NotOnThisPlatform=Ovaj program ne radi na %1. OnlyOnThisPlatform=Ovaj program se mora pokrenuti na %1. -OnlyOnTheseArchitectures=Ovaj program se moe instalirati samo na verzijama Windowsa napravljenim za sljedee arhitekture procesora:%n%n%1 -MissingWOW64APIs=Verzija Windowsa koju koristite ne sadri funkcionalnosti potrebne da bi instalacijski program mogao instalirati 64-bitnu verziju. Da bi ispravili taj problem, molimo instalirajte Service Pack %1. +OnlyOnTheseArchitectures=Ovaj program se može instalirati samo na verzijama Windowsa napravljenim za sljedeće arhitekture procesora:%n%n%1 WinVersionTooLowError=Ovaj program zahtjeva %1 verzije %2 ili noviju. -WinVersionTooHighError=Ovaj program se ne moe instalirati na %1 verziji %2 ili novijoj. +WinVersionTooHighError=Ovaj program se ne može instalirati na %1 verziji %2 ili novijoj. AdminPrivilegesRequired=Morate imati administratorska prava pri instaliranju ovog programa. -PowerUserPrivilegesRequired=Morate imati administratorska prava ili biti lan grupe Power Users prilikom instaliranja ovog programa. -SetupAppRunningError=Instalacija je detektovala da je %1 pokrenut.%n%nMolimo zatvorite program i sve njegove kopije i potom kliknite Dalje za nastavak ili Odustani za prekid. -UninstallAppRunningError=Deinstalacija je detektovala da je %1 trenutno pokrenut.%n%nMolimo zatvorite program i sve njegove kopije i potom kliknite Dalje za nastavak ili Odustani za prekid. +PowerUserPrivilegesRequired=Morate imati administratorska prava ili biti član grupe Power Users prilikom instaliranja ovog programa. +SetupAppRunningError=Instalacija je detektovala da je %1 pokrenut.%n%nMolimo zatvorite program i sve njegove kopije i potom kliknite Dalje za nastavak ili Otkaži za prekid. +UninstallAppRunningError=Deinstalacija je detektovala da je %1 trenutno pokrenut.%n%nMolimo zatvorite program i sve njegove kopije i potom kliknite Dalje za nastavak ili Otkaži za prekid. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Odaberite način instalacije +PrivilegesRequiredOverrideInstruction=Odaberite način instalacije +PrivilegesRequiredOverrideText1=%1 može biti instaliran za sve korisnike (zahtijeva administrativne privilegije) ili samo za vas. +PrivilegesRequiredOverrideText2=%1 može da se instalira samo za vas ili za sve korisnike (zahtijeva administrativne privilegije). +PrivilegesRequiredOverrideAllUsers=Instaliraj za &sve korisnike +PrivilegesRequiredOverrideAllUsersRecommended=Instaliraj za &sve korisnike (preporučeno) +PrivilegesRequiredOverrideCurrentUser=Instaliraj samo za &mene +PrivilegesRequiredOverrideCurrentUserRecommended=Instaliraj samo za &mene (preporučeno) ; *** Misc. errors ErrorCreatingDir=Instalacija nije mogla kreirati folder "%1" -ErrorTooManyFilesInDir=Instalacija nije mogla kreirati datoteku u folderu "%1" zato to on sadri previe datoteka +ErrorTooManyFilesInDir=Instalacija nije mogla kreirati datoteku u folderu "%1" zato što on sadrži previše datoteka ; *** Setup common messages ExitSetupTitle=Prekid instalacije -ExitSetupMessage=Instalacija nije zavrena. Ako sada izaete, program nee biti instaliran.%n%nInstalaciju moete pokrenuti kasnije u sluaju da je elite zavriti.%n%nPrekid instalacije? +ExitSetupMessage=Instalacija nije završena. Ako sada izađete, program neće biti instaliran.%n%nInstalaciju možete pokrenuti kasnije u slučaju da je želite završiti.%n%nPrekid instalacije? AboutSetupMenuItem=&O instalaciji... AboutSetupTitle=O instalaciji -AboutSetupMessage=%1 verzija %2%n%3%n%n%1 poetna stranica:%n%4 +AboutSetupMessage=%1 verzija %2%n%3%n%n%1 početna stranica:%n%4 AboutSetupNote= TranslatorNote= @@ -74,233 +93,271 @@ ButtonBack=< Na&zad ButtonNext=Da&lje > ButtonInstall=&Instaliraj ButtonOK=U redu -ButtonCancel=Otkai +ButtonCancel=Otkaži ButtonYes=&Da ButtonYesToAll=Da za &sve ButtonNo=&Ne ButtonNoToAll=N&e za sve -ButtonFinish=&Zavri +ButtonFinish=&Završi ButtonBrowse=&Izaberi... ButtonWizardBrowse=Iza&beri... ButtonNewFolder=&Napravi novi folder ; *** "Select Language" dialog messages SelectLanguageTitle=Izaberite jezik instalacije -SelectLanguageLabel=Izaberite jezik koji elite koristiti pri instalaciji: +SelectLanguageLabel=Izaberite jezik koji želite koristiti pri instalaciji: ; *** Common wizard text -ClickNext=Kliknite na Dalje za nastavak ili Otkai za prekid instalacije. +ClickNext=Kliknite na Dalje za nastavak ili Otkaži za prekid instalacije. BeveledLabel= BrowseDialogTitle=Izaberite folder BrowseDialogLabel=Izaberite folder iz liste ispod, pa onda kliknite na U redu. NewFolderName=Novi folder ; *** "Welcome" wizard page -WelcomeLabel1=Dobro doli u instalaciju programa [name] -WelcomeLabel2=Ovaj program e instalirati [name/ver] na va raunar.%n%nPreporuujemo da zatvorite sve druge programe prije nastavka i da privremeno onemoguite va antivirus i firewall. +WelcomeLabel1=Dobro došli u instalaciju programa [name] +WelcomeLabel2=Ovaj program će instalirati [name/ver] na vaš računar.%n%nPreporučujemo da zatvorite sve druge programe prije nastavka i da privremeno onemogućite vaš antivirus i firewall. ; *** "Password" wizard page -WizardPassword=ifra -PasswordLabel1=Instalacija je zatiena ifrom. -PasswordLabel3=Upiite ifru i kliknite Dalje za nastavak. ifre su osjetljive na mala i velika slova. -PasswordEditLabel=&ifra: -IncorrectPassword=Upisali ste pogrenu ifru. Pokuajte ponovo. +WizardPassword=Šifra +PasswordLabel1=Instalacija je zaštićena šifrom. +PasswordLabel3=Upišite šifru i kliknite Dalje za nastavak. Šifre su osjetljive na mala i velika slova. +PasswordEditLabel=&Šifra: +IncorrectPassword=Upisali ste pogrešnu šifru. Pokušajte ponovo. ; *** "License Agreement" wizard page -WizardLicense=Ugovor o koritenju -LicenseLabel=Molimo vas da, prije nastavka, paljivo proitajte sljedee informacije. -LicenseLabel3=Molimo vas da paljivo proitate Ugovor o koritenju. Morate prihvatiti uslove ugovora kako biste mogli nastaviti s instalacijom. +WizardLicense=Ugovor o korištenju +LicenseLabel=Molimo vas da, prije nastavka, pažljivo pročitajte sljedeće informacije. +LicenseLabel3=Molimo vas da pažljivo pročitate Ugovor o korištenju. Morate prihvatiti uslove ugovora kako biste mogli nastaviti s instalacijom. LicenseAccepted=&Prihvatam ugovor LicenseNotAccepted=&Ne prihvatam ugovor ; *** "Information" wizard pages WizardInfoBefore=Informacija -InfoBeforeLabel=Molimo vas da, prije nastavka, proitate sljedee informacije. +InfoBeforeLabel=Molimo vas da, prije nastavka, pročitate sljedeće informacije. InfoBeforeClickLabel=Kada budete spremni nastaviti instalaciju, kliknite na Dalje. WizardInfoAfter=Informacija -InfoAfterLabel=Molimo vas da, prije nastavka, proitate sljedee informacije. +InfoAfterLabel=Molimo vas da, prije nastavka, pročitate sljedeće informacije. InfoAfterClickLabel=Kada budete spremni nastaviti instalaciju, kliknite na Dalje. ; *** "User Information" wizard page WizardUserInfo=Informacije o korisniku -UserInfoDesc=Upiite vae line informacije. +UserInfoDesc=Upišite vaše lične informacije. UserInfoName=&Ime korisnika: UserInfoOrg=&Organizacija: UserInfoSerial=&Serijski broj: UserInfoNameRequired=Morate upisati ime. ; *** "Select Destination Location" wizard page -WizardSelectDir=Odaberite odredini folder -SelectDirDesc=Gdje elite da instalirate [name]? -SelectDirLabel3=Instalacija e instalirati [name] u sljedei folder. -SelectDirBrowseLabel=Za nastavak, kliknite Dalje. Ako elite izabrati drugi folder, kliknite Izaberi. -DiskSpaceMBLabel=Ovaj program zahtjeva najmanje [mb] MB slobodnog prostora na disku. -CannotInstallToNetworkDrive=Instalacija nije mogua na mrenom disku. -CannotInstallToUNCPath=Instalacija nije mogua za UNC putanju. +WizardSelectDir=Odaberite odredišni folder +SelectDirDesc=Gdje želite da instalirate [name]? +SelectDirLabel3=Instalacija će instalirati [name] u sljedeći folder. +SelectDirBrowseLabel=Za nastavak, kliknite Dalje. Ako želite izabrati drugi folder, kliknite Izaberi. +DiskSpaceGBLabel=Potrebno je najmanje [gb] GB slobodnog prostora na disku. +DiskSpaceMBLabel=Potrebno je najmanje [mb] MB slobodnog prostora na disku. +CannotInstallToNetworkDrive=Instalacija nije moguća na mrežnom disku. +CannotInstallToUNCPath=Instalacija nije moguća za UNC putanju. InvalidPath=Morate unijeti punu putanju zajedno sa slovom diska; npr:%n%nC:\APP%n%nili UNC putanju u obliku:%n%n\\server\share InvalidDrive=Disk ili UNC share koji ste odabrali ne postoji ili je nedostupan. Odaberite neki drugi. DiskSpaceWarningTitle=Nedovoljno prostora na disku -DiskSpaceWarning=Instalacija zahtjeva bar %1 KB slobodnog prostora, a odabrani disk ima samo %2 KB na raspolaganju.%n%nDa li elite nastaviti? +DiskSpaceWarning=Instalacija zahtjeva bar %1 KB slobodnog prostora, a odabrani disk ima samo %2 KB na raspolaganju.%n%nŽelite li nastaviti? DirNameTooLong=Naziv ili putanja do foldera su predugi. InvalidDirName=Naziv foldera nije ispravan. -BadDirName32=Naziv foldera ne smije sadravati niti jedan od sljedeih znakova:%n%n%1 +BadDirName32=Naziv foldera ne smije sadržavati niti jedan od sljedećih znakova:%n%n%1 DirExistsTitle=Folder postoji -DirExists=Folder:%n%n%1%n%nve postoji. elite li i dalje izvriti instalaciju u njega? +DirExists=Folder:%n%n%1%n%nveć postoji. Želite li i dalje izvršiti instalaciju u njega? DirDoesntExistTitle=Folder ne postoji -DirDoesntExist=Folder:%n%n%1%n%nne postoji. elite li ga napraviti? +DirDoesntExist=Folder:%n%n%1%n%nne postoji. Želite li ga napraviti? ; *** "Select Components" wizard page WizardSelectComponents=Odaberite komponente -SelectComponentsDesc=Koje komponente elite instalirati? -SelectComponentsLabel2=Odaberite komponente koje elite instalirati ili uklonite kvaicu pored komponenti koje ne elite. Kliknite Dalje kad budete spremni da nastavite. +SelectComponentsDesc=Koje komponente želite instalirati? +SelectComponentsLabel2=Odaberite komponente koje želite instalirati ili uklonite kvačicu pored komponenti koje ne želite. Kliknite Dalje kad budete spremni da nastavite. FullInstallation=Puna instalacija ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Kompaktna instalacija -CustomInstallation=Instalacija prema elji +CustomInstallation=Instalacija prema želji NoUninstallWarningTitle=Komponente postoje -NoUninstallWarning=Instalacija je detektovala da na vaem raunaru ve postoje sljedee komponente:%n%n%1%n%nAko ove komponente ne odaberete, nee doi do njihove deinstalacije.%n%nelite li ipak nastaviti? +NoUninstallWarning=Instalacija je detektovala da na vašem računaru već postoje sljedeće komponente:%n%n%1%n%nAko ove komponente ne odaberete, neće doći do njihove deinstalacije.%n%nŽelite li ipak nastaviti? ComponentSize1=%1 KB ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Trenutni izbor zahtjeva bar [mb] MB prostora na disku. +ComponentsDiskSpaceGBLabel=Trenutni izbor zahtijeva najmanje [mb] GB prostora na disku. +ComponentsDiskSpaceMBLabel=Trenutni izbor zahtijeva najmanje [mb] MB prostora na disku. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Izaberite dodatne radnje -SelectTasksDesc=Koje dodatne radnje elite da se izvre? -SelectTasksLabel2=Izaberite radnje koje e se izvriti tokom instalacije programa [name], onda kliknite Dalje. +SelectTasksDesc=Koje dodatne radnje želite da se izvrše? +SelectTasksLabel2=Izaberite radnje koje će se izvršiti tokom instalacije programa [name], onda kliknite Dalje. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Izaberite programsku grupu -SelectStartMenuFolderDesc=Gdje instalacija treba da napravi preice? -SelectStartMenuFolderLabel3=Izaberite folder iz Start menija u koji elite da instalacija kreira preicu, a zatim kliknite na Dalje. -SelectStartMenuFolderBrowseLabel=Za nastavak, kliknite Dalje. Ako elite da izaberete drugi folder, kliknite Izaberi. +SelectStartMenuFolderDesc=Gdje instalacija treba da napravi prečice? +SelectStartMenuFolderLabel3=Izaberite folder iz Start menija u koji želite da instalacija kreira prečicu, a zatim kliknite na Dalje. +SelectStartMenuFolderBrowseLabel=Za nastavak, kliknite Dalje. Ako želite da izaberete drugi folder, kliknite Izaberi. MustEnterGroupName=Morate unijeti ime programske grupe. GroupNameTooLong=Naziv foldera ili putanje je predug. InvalidGroupName=Naziv foldera nije ispravan. -BadGroupName=Naziv foldera ne smije sadravati niti jedan od sljedeih znakova:%n%n%1 +BadGroupName=Naziv foldera ne smije sadržavati niti jedan od sljedećih znakova:%n%n%1 NoProgramGroupCheck2=&Ne kreiraj programsku grupu ; *** "Ready to Install" wizard page WizardReady=Spreman za instalaciju -ReadyLabel1=Sada smo spremni za instalaciju [name] na va raunar. -ReadyLabel2a=Kliknite na Instaliraj ako elite instalirati program ili na Nazad ako elite pregledati ili promjeniti postavke. -ReadyLabel2b=Kliknite na Instaliraj ako elite nastaviti sa instalacijom programa. +ReadyLabel1=Sada smo spremni za instalaciju [name] na vaš računar. +ReadyLabel2a=Kliknite na Instaliraj ako želite instalirati program ili na Nazad ako želite pregledati ili promjeniti postavke. +ReadyLabel2b=Kliknite na Instaliraj ako želite nastaviti sa instalacijom programa. ReadyMemoUserInfo=Informacije o korisniku: -ReadyMemoDir=Odredini folder: +ReadyMemoDir=Odredišni folder: ReadyMemoType=Tip instalacije: ReadyMemoComponents=Odabrane komponente: ReadyMemoGroup=Programska grupa: ReadyMemoTasks=Dodatne radnje: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Preuzimanje dodatnih datoteka... +ButtonStopDownload=&Zaustavi preuzimanje +StopDownload=Jeste li sigurni da želite zaustaviti preuzimanje? +ErrorDownloadAborted=Preuzimanje je prekinuto +ErrorDownloadFailed=Preuzimanje nije uspjelo: %1 %2 +ErrorDownloadSizeFailed=Dobijanje veličine nije uspjelo: %1 %2 +ErrorFileHash1=Heš datoteke nije uspio: %1 +ErrorFileHash2=Neispravan heš datoteke: očekivan %1, pronađen %2 +ErrorProgress=Neispravan napredak: %1 od %2 +ErrorFileSize=Neispravna veličina datoteke: očekivana %1, pronađena %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Pripremam instalaciju -PreparingDesc=Pripreme za instalaciju [name] na va raunar. -PreviousInstallNotCompleted=Instalacija/deinstalacija prethodnog programa nije zavrena. Morate restartovati va raunar kako bi zavrili tu instalaciju.%n%nNakon toga, ponovno pokrenite ovaj program kako bi dovrili instalaciju za [name]. -CannotContinue=Instalacija ne moe nastaviti. Molimo vas da kliknete na Odustani za izlaz. -ApplicationsFound=Sljedee aplikacije koriste datoteke koje ova instalacija treba da nadogradi. Preporuujemo vam da omoguite instalaciji da automatski zatvori ove aplikacije. -ApplicationsFound2=Sljedee aplikacije koriste datoteke koje ova instalacija treba da nadogradi. Preporuujemo vam da omoguite instalaciji da automatski zatvori ove aplikacije. Nakon to se sve zavri, bit e izvren pokuaj ponovnog pokretanja ovih aplikacija. +PreparingDesc=Pripreme za instalaciju [name] na vaš računar. +PreviousInstallNotCompleted=Instalacija/deinstalacija prethodnog programa nije završena. Morate restartovati vaš računar kako bi završili tu instalaciju.%n%nNakon toga, ponovno pokrenite ovaj program kako bi dovršili instalaciju za [name]. +CannotContinue=Instalacija ne može nastaviti. Molimo vas da kliknete na Otkaži za izlaz. +ApplicationsFound=Sljedeće aplikacije koriste datoteke koje ova instalacija treba da nadogradi. Preporučujemo vam da omogućite instalaciji da automatski zatvori ove aplikacije. +ApplicationsFound2=Sljedeće aplikacije koriste datoteke koje ova instalacija treba da nadogradi. Preporučujemo vam da omogućite instalaciji da automatski zatvori ove aplikacije. Nakon što se sve završi, bit će izvršen pokušaj ponovnog pokretanja ovih aplikacija. CloseApplications=&Automatski zatvori aplikacije DontCloseApplications=&Ne zatvaraj aplikacije -ErrorCloseApplications=Instalacija nije mogla automatski zatvoriti sve aplikacije. Prije nego nastavite, preporuujemo vam da zatvorite sve aplikacije koje koriste datoteke koje e ova instalacija trebati da aurira. +ErrorCloseApplications=Instalacija nije mogla automatski zatvoriti sve aplikacije. Prije nego nastavite, preporučujemo vam da zatvorite sve aplikacije koje koriste datoteke koje će ova instalacija trebati da ažurira. +PrepareToInstallNeedsRestart=Instalacija mora ponovo pokrenuti vaš računar. Nakon ponovnog pokretanja vašeg računara, pokrenite instalaciju ponovo da biste završili instalaciju [name].%n%nŽelite li da ponovo pokrenete računar sada? ; *** "Installing" wizard page WizardInstalling=Instaliram -InstallingLabel=Priekajte dok se ne zavri instalacija programa [name] na va raunar. +InstallingLabel=Pričekajte dok se ne završi instalacija programa [name] na vaš računar. ; *** "Setup Completed" wizard page -FinishedHeadingLabel=Zavravam instalaciju [name] -FinishedLabelNoIcons=Instalacija programa [name] je zavrena. -FinishedLabel=Instalacija programa [name] je zavrena. Program moete pokrenuti koristei instalirane ikone. -ClickFinish=Kliknite na Zavri da biste izali iz instalacije. -FinishedRestartLabel=Da biste instalaciju programa [name] zavrili, potrebno je restartovati raunar. elite li to sada uiniti? -FinishedRestartMessage=Zavretak instalacije programa [name] zahtjeva restart vaeg raunara.%n%nelite li to sada uiniti? -ShowReadmeCheck=Da, elim proitati README datoteku. -YesRadio=&Da, restartuj raunar sada -NoRadio=&Ne, restartovat u raunar kasnije +FinishedHeadingLabel=Završavam instalaciju [name] +FinishedLabelNoIcons=Instalacija programa [name] je završena. +FinishedLabel=Instalacija programa [name] je završena. Program možete pokrenuti koristeći instalirane ikone. +ClickFinish=Kliknite na Završi da biste izašli iz instalacije. +FinishedRestartLabel=Da biste instalaciju programa [name] završili, potrebno je restartovati računar. Želite li to sada učiniti? +FinishedRestartMessage=Završetak instalacije programa [name] zahtjeva restart vašeg računara.%n%nŽelite li to sada učiniti? +ShowReadmeCheck=Da, želim pročitati README datoteku. +YesRadio=&Da, restartuj računar sada +NoRadio=&Ne, restartovat ću računar kasnije ; used for example as 'Run MyProg.exe' RunEntryExec=Pokreni %1 ; used for example as 'View Readme.txt' -RunEntryShellExec=Proitaj %1 +RunEntryShellExec=Pročitaj %1 ; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=Instalacija treba sljedei disk +ChangeDiskTitle=Instalacija treba sljedeći disk SelectDiskLabel2=Molimo ubacite Disk %1 i kliknite U redu.%n%nAko se datoteke na ovom disku nalaze u drugom folderu a ne u onom prikazanom ispod, unesite ispravnu putanju ili kliknite na Izaberi. PathLabel=&Putanja: -FileNotInDir2=Datoteka "%1" ne postoji u "%2". Molimo vas ubacite odgovorajui disk ili odaberete drugi folder. -SelectDirectoryLabel=Molimo odaberite lokaciju sljedeeg diska. +FileNotInDir2=Datoteka "%1" ne postoji u "%2". Molimo vas ubacite odgovorajući disk ili odaberete drugi folder. +SelectDirectoryLabel=Molimo odaberite lokaciju sljedećeg diska. ; *** Installation phase messages -SetupAborted=Instalacija nije zavrena.%n%nMolimo vas da rijeite problem i opet pokrenete instalaciju. -EntryAbortRetryIgnore=Kliknite na Retry da pokuate opet, Ignore da nastavite, ili Abort da prekinete instalaciju. +SetupAborted=Instalacija nije završena.%n%nMolimo vas da riješite problem i ponovo pokrenete instalaciju. +AbortRetryIgnoreSelectAction=Izaberi radnju +AbortRetryIgnoreRetry=&Pokušaj ponovo +AbortRetryIgnoreIgnore=&Zanemari grešku i nastavi +AbortRetryIgnoreCancel=Prekini instalaciju ; *** Installation status messages StatusClosingApplications=Zatvaram aplikacije... StatusCreateDirs=Kreiram foldere... StatusExtractFiles=Raspakujem datoteke... -StatusCreateIcons=Kreiram preice... +StatusCreateIcons=Kreiram prečice... StatusCreateIniEntries=Kreiram INI datoteke... StatusCreateRegistryEntries=Kreiram podatke za registracijsku bazu... StatusRegisterFiles=Registrujem datoteke... StatusSavingUninstall=Snimam deinstalacijske informacije... -StatusRunProgram=Zavravam instalaciju... +StatusRunProgram=Završavam instalaciju... StatusRestartingApplications=Restartujem aplikaciju... -StatusRollback=Ponitavam promjene... +StatusRollback=Poništavam promjene... ; *** Misc. errors -ErrorInternal2=Interna greka: %1 +ErrorInternal2=Interna greška: %1 ErrorFunctionFailedNoCode=%1 nije uspjelo ErrorFunctionFailed=%1 nije uspjelo; kod %2 ErrorFunctionFailedWithMessage=%1 nije uspjelo; kod %2.%n%3 ErrorExecutingProgram=Ne mogu pokrenuti datoteku:%n%1 ; *** Registry errors -ErrorRegOpenKey=Greka pri otvaranju registracijskog kljua:%n%1\%2 -ErrorRegCreateKey=Greka pri kreiranju registracijskog kljua:%n%1\%2 -ErrorRegWriteKey=Greka pri zapisivanju registracijskog kljua:%n%1\%2 +ErrorRegOpenKey=Greška pri otvaranju registracijskog ključa:%n%1\%2 +ErrorRegCreateKey=Greška pri kreiranju registracijskog ključa:%n%1\%2 +ErrorRegWriteKey=Greška pri zapisivanju registracijskog ključa:%n%1\%2 ; *** INI errors -ErrorIniEntry=Greka pri kreiranju INI podataka u datoteci "%1". +ErrorIniEntry=Greška pri kreiranju INI podataka u datoteci "%1". ; *** File copying errors -FileAbortRetryIgnore=Kliknite Retry da pokuate ponovo, Ignore da preskoite ovu datoteku (nije preporueno), ili Abort da prekinete instalaciju. -FileAbortRetryIgnore2=Kliknite Retry da pokuate ponovo, Ignore da preskoite ovu datoteku (nije preporueno), ili Abort da prekinete instalaciju. -SourceIsCorrupted=Izvorna datoteka je oteena +FileAbortRetryIgnoreSkipNotRecommended=&Preskočite ovu datoteku (nije preporučeno) +FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (nije preporučeno) +SourceIsCorrupted=Izvorna datoteka je oštećena SourceDoesntExist=Izvorna datoteka "%1" ne postoji -ExistingFileReadOnly=Postojea datoteka je oznaena kao samo za itanje.%n%nKliknite Retry da uklonite ovu oznaku i pokuate ponovo, Ignore da preskoite ovu datoteku, ili Abort da prekinete instalaciju. -ErrorReadingExistingDest=Dolo je do greke prilikom pokuaja itanja postojee datoteke: -FileExists=Datoteka ve postoji.%n%nelite li pisati preko nje? -ExistingFileNewer=Postojea datoteka je novija od one koju pokuavate instalirati. Preporuujemo vam da zadrite postojeu datoteku.%n%nelite li zadrati postojeu datoteku? -ErrorChangingAttr=Pojavila se greka prilikom pokuaja promjene atributa postojee datoteke: -ErrorCreatingTemp=Pojavila se greka prilikom pokuaja kreiranja datoteke u odredinom folderu: -ErrorReadingSource=Pojavila se greka prilikom pokuaja itanja izvorne datoteke: -ErrorCopying=Pojavila se greka prilikom pokuaja kopiranja datoteke: -ErrorReplacingExistingFile=Pojavila se greka prilikom pokuaja zamjene datoteke: +ExistingFileReadOnly2=Postojeća datoteka ne može biti zamijenjena jer je označena samo za čitanje. +ExistingFileReadOnlyRetry=&Uklonite atribut samo za čitanje i pokušajte ponovo +ExistingFileReadOnlyKeepExisting=&Zadržite postojeću datoteku +ErrorReadingExistingDest=Došlo je do greške prilikom pokušaja čitanja postojeće datoteke: +FileExistsSelectAction=Izaberite radnju +FileExists2=Datoteka već postoji. +FileExistsOverwriteExisting=&Zamijeni postojeću datoteku +FileExistsKeepExisting=&Zadrži postojeću datoteku +FileExistsOverwriteOrKeepAll=&Uradi ovo i za sljedeća neslaganja +ExistingFileNewerSelectAction=Izaberi radnju +ExistingFileNewer2=Postojeća datoteka je novija od one koja se pokušava instalirati. +ExistingFileNewerOverwriteExisting=&Zamijeni postojeću datoteku +ExistingFileNewerKeepExisting=&Zadrži postojeću datoteku (preporučeno) +ExistingFileNewerOverwriteOrKeepAll=&Uradi ovo i za sljedeća neslaganja +ErrorChangingAttr=Pojavila se greška prilikom pokušaja promjene atributa postojeće datoteke: +ErrorCreatingTemp=Pojavila se greška prilikom pokušaja kreiranja datoteke u odredišnom folderu: +ErrorReadingSource=Pojavila se greška prilikom pokušaja čitanja izvorne datoteke: +ErrorCopying=Pojavila se greška prilikom pokušaja kopiranja datoteke: +ErrorReplacingExistingFile=Pojavila se greška prilikom pokušaja zamjene datoteke: ErrorRestartReplace=Ponovno pokretanje i zamjena nije uspjela: -ErrorRenamingTemp=Pojavila se greka prilikom pokuaja preimenovanja datoteke u odredinom folderu: +ErrorRenamingTemp=Pojavila se greška prilikom pokušaja preimenovanja datoteke u odredišnom folderu: ErrorRegisterServer=Ne mogu registrovati DLL/OCX: %1 -ErrorRegSvr32Failed=RegSvr32 nije ispravno izvren, kod na kraju izvravanja %1 +ErrorRegSvr32Failed=RegSvr32 nije ispravno izvršen, kod na kraju izvršavanja %1 ErrorRegisterTypeLib=Ne mogu registrovati tip biblioteke: %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Svi korisnici +UninstallDisplayNameMarkCurrentUser=Trenutni korisnik + ; *** Post-installation errors -ErrorOpeningReadme=Pojavila se greka prilikom pokuaja otvaranja README datoteke. -ErrorRestartingComputer=Instalacija ne moe restartovati va raunar. Molimo vas da to uinite runo. +ErrorOpeningReadme=Pojavila se greška prilikom pokušaja otvaranja README datoteke. +ErrorRestartingComputer=Instalacija ne može restartovati vaš računar. Molimo vas da to učinite ručno. ; *** Uninstaller messages UninstallNotFound=Datoteka "%1" ne postoji. Deinstalacija prekinuta. -UninstallOpenError=Datoteka "%1" se ne moe otvoriti. Deinstalacija nije mogua -UninstallUnsupportedVer=Deinstalacijska log datoteka "%1" je u formatu koji nije prepoznat od ove verzije deinstalera. Nije mogua deinstalacija +UninstallOpenError=Datoteka "%1" se ne može otvoriti. Deinstalacija nije moguća +UninstallUnsupportedVer=Deinstalacijska log datoteka "%1" je u formatu koji nije prepoznat od ove verzije deinstalera. Nije moguća deinstalacija UninstallUnknownEntry=Nepoznat zapis (%1) je pronadjen u deinstalacijskoj log datoteci -ConfirmUninstall=Da li ste sigurni da elite ukloniti %1 i sve njegove komponente? -UninstallOnlyOnWin64=Ovaj program se moe deinstalirati samo na 64-bitnom Windowsu. -OnlyAdminCanUninstall=Ova instalacija moe biti uklonjena samo od korisnika sa administratorskim privilegijama. -UninstallStatusLabel=Molimo priekajte dok %1 ne bude uklonjen s vaeg raunara. -UninstalledAll=Program %1 je uspjeno uklonjen sa vaeg raunara. -UninstalledMost=Deinstalacija programa %1 je zavrena.%n%nNeke elemente nije bilo mogue ukloniti. Molimo vas da to uinite runo. -UninstalledAndNeedsRestart=Da bi zavrili deinstalaciju %1, Va raunar morate restartati%n%nelite li to uiniti sada? -UninstallDataCorrupted="%1" datoteka je oteena. Deinstalacija nije mogua. +ConfirmUninstall=Jeste li sigurni da želite ukloniti %1 i sve njegove komponente? +UninstallOnlyOnWin64=Ovaj program se može deinstalirati samo na 64-bitnom Windowsu. +OnlyAdminCanUninstall=Ova instalacija može biti uklonjena samo od korisnika sa administratorskim privilegijama. +UninstallStatusLabel=Molimo pričekajte dok %1 ne bude uklonjen s vašeg računara. +UninstalledAll=Program %1 je uspješno uklonjen sa vašeg računara. +UninstalledMost=Deinstalacija programa %1 je završena.%n%nNeke elemente nije bilo moguće ukloniti. Molimo vas da to učinite ručno. +UninstalledAndNeedsRestart=Da bi završili deinstalaciju %1, Vaš računar morate restartati%n%nŽelite li to učiniti sada? +UninstallDataCorrupted="%1" datoteka je oštećena. Deinstalacija nije moguća. ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Ukloni dijeljenu datoteku -ConfirmDeleteSharedFile2=Sistem smatra da sljedee dijeljene datoteke ne koristi nijedan drugi program. elite li ukloniti te dijeljene datoteke?%n%nAko neki programi i dalje koriste ove datoteke, a one se obriu, ti programi nee raditi ispravno. Ako niste sigurni, odaberite Ne. Ostavljanje datoteka nee uzrokovati tetu vaem sistemu. +ConfirmDeleteSharedFile2=Sistem smatra da sljedeće dijeljene datoteke ne koristi nijedan drugi program. Želite li ukloniti te dijeljene datoteke?%n%nAko neki programi i dalje koriste ove datoteke, a one se obrišu, ti programi neće raditi ispravno. Ako niste sigurni, odaberite Ne. Ostavljanje datoteka neće uzrokovati štetu vašem sistemu. SharedFileNameLabel=Datoteka: SharedFileLocationLabel=Putanja: WizardUninstalling=Status deinstalacije @@ -325,5 +382,5 @@ LaunchProgram=Pokreni %1 AssocFileExtension=&Asociraj %1 sa %2 ekstenzijom AssocingFileExtension=Asociram %1 sa %2 ekstenzijom... AutoStartProgramGroupDescription=Pokretanje: -AutoStartProgram=Automatski pokrei %1 -AddonHostProgramNotFound=%1 nije mogao biti pronaen u folderu koji ste odabrali.%n%nDa li i dalje elite nastaviti s ovom akcijom? +AutoStartProgram=Automatski pokreći %1 +AddonHostProgramNotFound=%1 nije mogao biti pronađen u folderu koji ste odabrali.%n%nŽelite li nastaviti s ovom akcijom? diff --git a/installer/innosetup/Languages/BrazilianPortuguese.isl b/installer/innosetup/Languages/BrazilianPortuguese.isl new file mode 100644 index 000000000..69edb37f2 --- /dev/null +++ b/installer/innosetup/Languages/BrazilianPortuguese.isl @@ -0,0 +1,384 @@ +; *** Inno Setup version 6.1.0+ Brazilian Portuguese messages made by Cesar82 cesar.zanetti.82@gmail.com *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Portugus Brasileiro +LanguageID=$0416 +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalador +SetupWindowTitle=%1 - Instalador +UninstallAppTitle=Desinstalar +UninstallAppFullTitle=Desinstalar %1 + +; *** Misc. common +InformationTitle=Informao +ConfirmTitle=Confirmar +ErrorTitle=Erro + +; *** SetupLdr messages +SetupLdrStartupMessage=Isto instalar o %1. Voc deseja continuar? +LdrCannotCreateTemp=Incapaz de criar um arquivo temporrio. Instalao abortada +LdrCannotExecTemp=Incapaz de executar o arquivo no diretrio temporrio. Instalao abortada +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nErro %2: %3 +SetupFileMissing=Est faltando o arquivo %1 do diretrio de instalao. Por favor corrija o problema ou obtenha uma nova cpia do programa. +SetupFileCorrupt=Os arquivos de instalao esto corrompidos. Por favor obtenha uma nova cpia do programa. +SetupFileCorruptOrWrongVer=Os arquivos de instalao esto corrompidos ou so incompatveis com esta verso do instalador. Por favor corrija o problema ou obtenha uma nova cpia do programa. +InvalidParameter=Um parmetro invlido foi passado na linha de comando:%n%n%1 +SetupAlreadyRunning=O instalador j est em execuo. +WindowsVersionNotSupported=Este programa no suporta a verso do Windows que seu computador est executando. +WindowsServicePackRequired=Este programa requer o %1 Service Pack %2 ou superior. +NotOnThisPlatform=Este programa no executar no %1. +OnlyOnThisPlatform=Este programa deve ser executado no %1. +OnlyOnTheseArchitectures=Este programa s pode ser instalado em verses do Windows projetadas para as seguintes arquiteturas de processadores:%n%n% 1 +WinVersionTooLowError=Este programa requer a %1 verso %2 ou superior. +WinVersionTooHighError=Este programa no pode ser instalado na %1 verso %2 ou superior. +AdminPrivilegesRequired=Voc deve estar logado como administrador quando instalar este programa. +PowerUserPrivilegesRequired=Voc deve estar logado como administrador ou como um membro do grupo de Usurios Power quando instalar este programa. +SetupAppRunningError=O instalador detectou que o %1 est atualmente em execuo.%n%nPor favor feche todas as instncias dele agora, ento clique em OK pra continuar ou em Cancelar pra sair. +UninstallAppRunningError=O Desinstalador detectou que o %1 est atualmente em execuo.%n%nPor favor feche todas as instncias dele agora, ento clique em OK pra continuar ou em Cancelar pra sair. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Selecione o Modo de Instalao do Instalador +PrivilegesRequiredOverrideInstruction=Selecione o modo de instalao +PrivilegesRequiredOverrideText1=O %1 pode ser instalado pra todos os usurios (requer privilgios administrativos) ou s pra voc. +PrivilegesRequiredOverrideText2=O %1 pode ser instalado s pra voc ou pra todos os usurios (requer privilgios administrativos). +PrivilegesRequiredOverrideAllUsers=Instalar pra &todos os usurios +PrivilegesRequiredOverrideAllUsersRecommended=Instalar pra &todos os usurios (recomendado) +PrivilegesRequiredOverrideCurrentUser=Instalar s &pra mim +PrivilegesRequiredOverrideCurrentUserRecommended=Instalar s &pra mim (recomendado) + +; *** Misc. errors +ErrorCreatingDir=O instalador foi incapaz de criar o diretrio "%1" +ErrorTooManyFilesInDir=Incapaz de criar um arquivo no diretrio "%1" porque ele contm arquivos demais + +; *** Setup common messages +ExitSetupTitle=Sair do Instalador +ExitSetupMessage=A Instalao no est completa. Se voc sair agora o programa no ser instalado.%n%nVoc pode executar o instalador de novo outra hora pra completar a instalao.%n%nSair do instalador? +AboutSetupMenuItem=&Sobre o Instalador... +AboutSetupTitle=Sobre o Instalador +AboutSetupMessage=%1 verso %2%n%3%n%n%1 home page:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< &Voltar +ButtonNext=&Avanar > +ButtonInstall=&Instalar +ButtonOK=OK +ButtonCancel=Cancelar +ButtonYes=&Sim +ButtonYesToAll=Sim pra &Todos +ButtonNo=&No +ButtonNoToAll=N&o pra Todos +ButtonFinish=&Concluir +ButtonBrowse=&Procurar... +ButtonWizardBrowse=P&rocurar... +ButtonNewFolder=&Criar Nova Pasta + +; *** "Select Language" dialog messages +SelectLanguageTitle=Selecione o Idioma do Instalador +SelectLanguageLabel=Selecione o idioma pra usar durante a instalao: + +; *** Common wizard text +ClickNext=Clique em Avanar pra continuar ou em Cancelar pra sair do instalador. +BeveledLabel= +BrowseDialogTitle=Procurar Pasta +BrowseDialogLabel=Selecione uma pasta na lista abaixo, ento clique em OK. +NewFolderName=Nova Pasta + +; *** "Welcome" wizard page +WelcomeLabel1=Bem-vindo ao Assistente do Instalador do [name] +WelcomeLabel2=Isto instalar o [name/ver] no seu computador.%n%n recomendado que voc feche todos os outros aplicativos antes de continuar. + +; *** "Password" wizard page +WizardPassword=Senha +PasswordLabel1=Esta instalao est protegida por senha. +PasswordLabel3=Por favor fornea a senha, ento clique em Avanar pra continuar. As senhas so caso-sensitivo. +PasswordEditLabel=&Senha: +IncorrectPassword=A senha que voc inseriu no est correta. Por favor tente de novo. + +; *** "License Agreement" wizard page +WizardLicense=Acordo de Licena +LicenseLabel=Por favor leia as seguintes informaes importantes antes de continuar. +LicenseLabel3=Por favor leia o seguinte Acordo de Licena. Voc deve aceitar os termos deste acordo antes de continuar com a instalao. +LicenseAccepted=Eu &aceito o acordo +LicenseNotAccepted=Eu &no aceito o acordo + +; *** "Information" wizard pages +WizardInfoBefore=Informao +InfoBeforeLabel=Por favor leia as seguintes informaes importantes antes de continuar. +InfoBeforeClickLabel=Quando voc estiver pronto pra continuar com o instalador, clique em Avanar. +WizardInfoAfter=Informao +InfoAfterLabel=Por favor leia as seguintes informaes importantes antes de continuar. +InfoAfterClickLabel=Quando voc estiver pronto pra continuar com o instalador, clique em Avanar. + +; *** "User Information" wizard page +WizardUserInfo=Informao do Usurio +UserInfoDesc=Por favor insira suas informaes. +UserInfoName=&Nome do Usurio: +UserInfoOrg=&Organizao: +UserInfoSerial=&Nmero de Srie: +UserInfoNameRequired=Voc deve inserir um nome. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Selecione o Local de Destino +SelectDirDesc=Aonde o [name] deve ser instalado? +SelectDirLabel3=O instalador instalar o [name] na seguinte pasta. +SelectDirBrowseLabel=Pra continuar clique em Avanar. Se voc gostaria de selecionar uma pasta diferente, clique em Procurar. +DiskSpaceGBLabel=Pelo menos [gb] MBs de espao livre em disco so requeridos. +DiskSpaceMBLabel=Pelo menos [mb] MBs de espao livre em disco so requeridos. +CannotInstallToNetworkDrive=O instalador no pode instalar em um drive de rede. +CannotInstallToUNCPath=O instalador no pode instalar em um caminho UNC. +InvalidPath=Voc deve inserir um caminho completo com a letra do drive; por exemplo:%n%nC:\APP%n%no um caminho UNC no formulrio:%n%n\\server\share +InvalidDrive=O drive ou compartilhamento UNC que voc selecionou no existe ou no est acessvel. Por favor selecione outro. +DiskSpaceWarningTitle=Sem Espao em Disco o Bastante +DiskSpaceWarning=O instalador requer pelo menos %1 KBs de espao livre pra instalar mas o drive selecionado s tem %2 KBs disponveis.%n%nVoc quer continuar de qualquer maneira? +DirNameTooLong=O nome ou caminho da pasta muito longo. +InvalidDirName=O nome da pasta no vlido. +BadDirName32=Os nomes das pastas no pode incluir quaisquer dos seguintes caracteres:%n%n%1 +DirExistsTitle=A Pasta Existe +DirExists=A pasta:%n%n%1%n%nj existe. Voc gostaria de instalar nesta pasta de qualquer maneira? +DirDoesntExistTitle=A Pasta No Existe +DirDoesntExist=A pasta:%n%n%1%n%nno existe. Voc gostaria quer a pasta fosse criada? + +; *** "Select Components" wizard page +WizardSelectComponents=Selecionar Componentes +SelectComponentsDesc=Quais componentes devem ser instalados? +SelectComponentsLabel2=Selecione os componentes que voc quer instalar; desmarque os componentes que voc no quer instalar. Clique em Avanar quando voc estiver pronto pra continuar. +FullInstallation=Instalao completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Instalao compacta +CustomInstallation=Instalao personalizada +NoUninstallWarningTitle=O Componente Existe +NoUninstallWarning=O instalador detectou que os seguintes componentes j esto instalados no seu computador:%n%n%1%n%nNo selecionar estes componentes no desinstalar eles.%n%nVoc gostaria de continuar de qualquer maneira? +ComponentSize1=%1 KBs +ComponentSize2=%1 MBs +ComponentsDiskSpaceGBLabel=A seleo atual requer pelo menos [gb] MBs de espao em disco. +ComponentsDiskSpaceMBLabel=A seleo atual requer pelo menos [mb] MBs de espao em disco. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Selecionar Tarefas Adicionais +SelectTasksDesc=Quais tarefas adicionais devem ser executadas? +SelectTasksLabel2=Selecione as tarefas adicionais que voc gostaria que o instalador executasse enquanto instala o [name], ento clique em Avanar. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Selecionar a Pasta do Menu Iniciar +SelectStartMenuFolderDesc=Aonde o instalador deve colocar os atalhos do programa? +SelectStartMenuFolderLabel3=O instalador criar os atalhos do programa na seguinte pasta do Menu Iniciar. +SelectStartMenuFolderBrowseLabel=Pra continuar clique em Avanar. Se voc gostaria de selecionar uma pasta diferente, clique em Procurar. +MustEnterGroupName=Voc deve inserir um nome de pasta. +GroupNameTooLong=O nome ou caminho da pasta muito longo. +InvalidGroupName=O nome da pasta no vlido. +BadGroupName=O nome da pasta no pode incluir quaisquer dos seguintes caracteres:%n%n%1 +NoProgramGroupCheck2=&No criar uma pasta no Menu Iniciar + +; *** "Ready to Install" wizard page +WizardReady=Pronto pra Instalar +ReadyLabel1=O instalador est agora pronto pra comear a instalar o [name] no seu computador. +ReadyLabel2a=Clique em Instalar pra continuar com a instalao ou clique em Voltar se voc quer revisar ou mudar quaisquer configuraes. +ReadyLabel2b=Clique em Instalar pra continuar com a instalao. +ReadyMemoUserInfo=Informao do usurio: +ReadyMemoDir=Local de destino: +ReadyMemoType=Tipo de instalao: +ReadyMemoComponents=Componentes selecionados: +ReadyMemoGroup=Pasta do Menu Iniciar: +ReadyMemoTasks=Tarefas adicionais: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Baixando arquivos adicionais... +ButtonStopDownload=&Parar download +StopDownload=Tem certeza que deseja parar o download? +ErrorDownloadAborted=Download abortado +ErrorDownloadFailed=Download falhou: %1 %2 +ErrorDownloadSizeFailed=Falha ao obter o tamanho: %1 %2 +ErrorFileHash1=Falha no hash do arquivo: %1 +ErrorFileHash2=Hash de arquivo invlido: esperado %1, encontrado %2 +ErrorProgress=Progresso invlido: %1 de %2 +ErrorFileSize=Tamanho de arquivo invlido: esperado %1, encontrado %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparando pra Instalar +PreparingDesc=O instalador est se preparando pra instalar o [name] no seu computador. +PreviousInstallNotCompleted=A instalao/remoo de um programa anterior no foi completada. Voc precisar reiniciar o computador pra completar essa instalao.%n%nAps reiniciar seu computador execute o instalador de novo pra completar a instalao do [name]. +CannotContinue=O instalador no pode continuar. Por favor clique em Cancelar pra sair. +ApplicationsFound=Os aplicativos a seguir esto usando arquivos que precisam ser atualizados pelo instalador. recomendados que voc permita ao instalador fechar automaticamente estes aplicativos. +ApplicationsFound2=Os aplicativos a seguir esto usando arquivos que precisam ser atualizados pelo instalador. recomendados que voc permita ao instalador fechar automaticamente estes aplicativos. Aps a instalao ter completado, o instalador tentar reiniciar os aplicativos. +CloseApplications=&Fechar os aplicativos automaticamente +DontCloseApplications=&No fechar os aplicativos +ErrorCloseApplications=O instalador foi incapaz de fechar automaticamente todos os aplicativos. recomendado que voc feche todos os aplicativos usando os arquivos que precisam ser atualizados pelo instalador antes de continuar. +PrepareToInstallNeedsRestart=A instalao deve reiniciar seu computador. Depois de reiniciar o computador, execute a Instalao novamente para concluir a instalao de [name].%n%nDeseja reiniciar agora? + +; *** "Installing" wizard page +WizardInstalling=Instalando +InstallingLabel=Por favor espere enquanto o instalador instala o [name] no seu computador. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Completando o Assistente do Instalador do [name] +FinishedLabelNoIcons=O instalador terminou de instalar o [name] no seu computador. +FinishedLabel=O instalador terminou de instalar o [name] no seu computador. O aplicativo pode ser iniciado selecionando os atalhos instalados. +ClickFinish=Clique em Concluir pra sair do Instalador. +FinishedRestartLabel=Pra completar a instalao do [name], o instalador deve reiniciar seu computador. Voc gostaria de reiniciar agora? +FinishedRestartMessage=Pra completar a instalao do [name], o instalador deve reiniciar seu computador.%n%nVoc gostaria de reiniciar agora? +ShowReadmeCheck=Sim, eu gostaria de visualizar o arquivo README +YesRadio=&Sim, reiniciar o computador agora +NoRadio=&No, eu reiniciarei o computador depois +; used for example as 'Run MyProg.exe' +RunEntryExec=Executar %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Visualizar %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=O Instalador Precisa do Prximo Disco +SelectDiskLabel2=Por favor insira o Disco %1 e clique em OK.%n%nSe os arquivos neste disco podem ser achados numa pasta diferente do que a exibida abaixo, insira o caminho correto ou clique em Procurar. +PathLabel=&Caminho: +FileNotInDir2=O arquivo "%1" no pde ser localizado em "%2". Por favor insira o disco correto ou selecione outra pasta. +SelectDirectoryLabel=Por favor especifique o local do prximo disco. + +; *** Installation phase messages +SetupAborted=A instalao no foi completada.%n%nPor favor corrija o problema e execute o instalador de novo. +AbortRetryIgnoreSelectAction=Selecionar ao +AbortRetryIgnoreRetry=&Tentar de novo +AbortRetryIgnoreIgnore=&Ignorar o erro e continuar +AbortRetryIgnoreCancel=Cancelar instalao + +; *** Installation status messages +StatusClosingApplications=Fechando aplicativos... +StatusCreateDirs=Criando diretrios... +StatusExtractFiles=Extraindo arquivos... +StatusCreateIcons=Criando atalhos... +StatusCreateIniEntries=Criando entradas INI... +StatusCreateRegistryEntries=Criando entradas do registro... +StatusRegisterFiles=Registrando arquivos... +StatusSavingUninstall=Salvando informaes de desinstalao... +StatusRunProgram=Concluindo a instalao... +StatusRestartingApplications=Reiniciando os aplicativos... +StatusRollback=Desfazendo as mudanas... + +; *** Misc. errors +ErrorInternal2=Erro interno: %1 +ErrorFunctionFailedNoCode=%1 falhou +ErrorFunctionFailed=%1 falhou; cdigo %2 +ErrorFunctionFailedWithMessage=%1 falhou; cdigo %2.%n%3 +ErrorExecutingProgram=Incapaz de executar o arquivo:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Erro ao abrir a chave do registro:%n%1\%2 +ErrorRegCreateKey=Erro ao criar a chave do registro:%n%1\%2 +ErrorRegWriteKey=Erro ao gravar a chave do registro:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Erro ao criar a entrada INI no arquivo "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Ignorar este arquivo (no recomendado) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorar o erro e continuar (no recomendado) +SourceIsCorrupted=O arquivo de origem est corrompido +SourceDoesntExist=O arquivo de origem "%1" no existe +ExistingFileReadOnly2=O arquivo existente no pde ser substitudo porque est marcado como somente-leitura. +ExistingFileReadOnlyRetry=&Remover o atributo somente-leitura e tentar de novo +ExistingFileReadOnlyKeepExisting=&Manter o arquivo existente +ErrorReadingExistingDest=Um erro ocorreu enquanto tentava ler o arquivo existente: +FileExistsSelectAction=Selecione a ao +FileExists2=O arquivo j existe. +FileExistsOverwriteExisting=&Sobrescrever o arquivo existente +FileExistsKeepExisting=&Mantenha o arquivo existente +FileExistsOverwriteOrKeepAll=&Faa isso para os prximos conflitos +ExistingFileNewerSelectAction=Selecione a ao +ExistingFileNewer2=O arquivo existente mais recente do que aquele que o Setup est tentando instalar. +ExistingFileNewerOverwriteExisting=&Sobrescrever o arquivo existente +ExistingFileNewerKeepExisting=&Mantenha o arquivo existente (recomendado) +ExistingFileNewerOverwriteOrKeepAll=&Faa isso para os prximos conflitos +ErrorChangingAttr=Um erro ocorreu enquanto tentava mudar os atributos do arquivo existente: +ErrorCreatingTemp=Um erro ocorreu enquanto tentava criar um arquivo no diretrio destino: +ErrorReadingSource=Um erro ocorreu enquanto tentava ler o arquivo de origem: +ErrorCopying=Um erro ocorreu enquanto tentava copiar um arquivo: +ErrorReplacingExistingFile=Um erro ocorreu enquanto tentava substituir o arquivo existente: +ErrorRestartReplace=ReiniciarSubstituir falhou: +ErrorRenamingTemp=Um erro ocorreu enquanto tentava renomear um arquivo no diretrio destino: +ErrorRegisterServer=Incapaz de registrar a DLL/OCX: %1 +ErrorRegSvr32Failed=O RegSvr32 falhou com o cdigo de sada %1 +ErrorRegisterTypeLib=Incapaz de registrar a biblioteca de tipos: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 bits +UninstallDisplayNameMark64Bit=64 bits +UninstallDisplayNameMarkAllUsers=Todos os usurios +UninstallDisplayNameMarkCurrentUser=Usurio atual + +; *** Post-installation errors +ErrorOpeningReadme=Um erro ocorreu enquanto tentava abrir o arquivo README. +ErrorRestartingComputer=O instalador foi incapaz de reiniciar o computador. Por favor faa isto manualmente. + +; *** Uninstaller messages +UninstallNotFound=O arquivo "%1" no existe. No consegue desinstalar. +UninstallOpenError=O arquivo "%1" no pde ser aberto. No consegue desinstalar +UninstallUnsupportedVer=O arquivo do log da desinstalao "%1" est num formato no reconhecido por esta verso do desinstalador. No consegue desinstalar +UninstallUnknownEntry=Uma entrada desconhecida (%1) foi encontrada no log da desinstalao +ConfirmUninstall=Voc tem certeza que voc quer remover completamente o %1 e todos os seus componentes? +UninstallOnlyOnWin64=Esta instalao s pode ser desinstalada em Windows 64 bits. +OnlyAdminCanUninstall=Esta instalao s pode ser desinstalada por um usurio com privilgios administrativos. +UninstallStatusLabel=Por favor espere enquanto o %1 removido do seu computador. +UninstalledAll=O %1 foi removido com sucesso do seu computador. +UninstalledMost=Desinstalao do %1 completa.%n%nAlguns elementos no puderam ser removidos. Estes podem ser removidos manualmente. +UninstalledAndNeedsRestart=Pra completar a desinstalao do %1, seu computador deve ser reiniciado.%n%nVoc gostaria de reiniciar agora? +UninstallDataCorrupted=O arquivo "%1" est corrompido. No consegue desinstalar + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Remover Arquivo Compartilhado? +ConfirmDeleteSharedFile2=O sistema indica que o seguinte arquivo compartilhado no est mais em uso por quaisquer programas. Voc gostaria que a Desinstalao removesse este arquivo compartilhado?%n%nSe quaisquer programas ainda esto usando este arquivo e ele removido, esses programas podem no funcionar apropriadamente. Se voc no tiver certeza escolha No. Deixar o arquivo no seu sistema no causar qualquer dano. +SharedFileNameLabel=Nome do arquivo: +SharedFileLocationLabel=Local: +WizardUninstalling=Status da Desinstalao +StatusUninstalling=Desinstalando o %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instalando o %1. +ShutdownBlockReasonUninstallingApp=Desinstalando o %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 verso %2 +AdditionalIcons=Atalhos adicionais: +CreateDesktopIcon=Criar um atalho &na rea de trabalho +CreateQuickLaunchIcon=Criar um atalho na &barra de inicializao rpida +ProgramOnTheWeb=%1 na Web +UninstallProgram=Desinstalar o %1 +LaunchProgram=Iniciar o %1 +AssocFileExtension=&Associar o %1 com a extenso do arquivo %2 +AssocingFileExtension=Associando o %1 com a extenso do arquivo %2... +AutoStartProgramGroupDescription=Inicializao: +AutoStartProgram=Iniciar o %1 automaticamente +AddonHostProgramNotFound=O %1 no pde ser localizado na pasta que voc selecionou.%n%nVoc quer continuar de qualquer maneira? diff --git a/installer/innosetup/Languages/Bulgarian.isl b/installer/innosetup/Languages/Bulgarian.isl index 65330ca41..923aee293 100644 --- a/installer/innosetup/Languages/Bulgarian.isl +++ b/installer/innosetup/Languages/Bulgarian.isl @@ -1,4 +1,4 @@ -; *** Inno Setup version 6.0.0+ Bulgarian messages *** +; *** Inno Setup version 6.1.0+ Bulgarian messages *** ; Ventsislav Dimitrov ; ; За да изтеглите преводи на този файл, предоставени от потребители, посетете: @@ -114,7 +114,7 @@ NewFolderName=Нова папка ; *** Страница "Добре дошли" на съветника WelcomeLabel1=Добре дошли при Съветника за инсталиране на [name] -WelcomeLabel2=Съветникът ще инсталира [name/ver] във вашия компютър.%n%nПрепоръчва се да затворите всички останали приложения, преди да продължите. +WelcomeLabel2=Съветникът ще инсталира [name/ver] във Вашия компютър.%n%nПрепоръчва се да затворите всички останали приложения, преди да продължите. ; *** Страница "Парола" на съветника WizardPassword=Парола @@ -151,6 +151,7 @@ WizardSelectDir=Избор на местоназначение SelectDirDesc=Къде да се инсталира [name]? SelectDirLabel3=[name] ще се инсталира в следната папка. SelectDirBrowseLabel=Натиснете "Напред", за да продължите. За да изберете друга папка, натиснете "Преглед". +DiskSpaceGBLabel=Изискват се поне [gb] ГБ свободно дисково пространство. DiskSpaceMBLabel=Изискват се поне [mb] МБ свободно дисково пространство. CannotInstallToNetworkDrive=Инсталаторът не може да инсталира на мрежово устройство. CannotInstallToUNCPath=Инсталаторът не може да инсталира в UNC път. @@ -171,13 +172,14 @@ WizardSelectComponents=Избор на компоненти SelectComponentsDesc=Кои компоненти да бъдат инсталирани? SelectComponentsLabel2=Изберете компонентите, които желаете да инсталирате, и откажете нежеланите. Натиснете "Напред", когато сте готов да продължите. FullInstallation=Пълна инсталация -; По възможност не превеждайте "Compact" като "Minimal" (има се предвид "Minimal" на вашия език) +; По възможност не превеждайте "Compact" като "Minimal" (има се предвид "Minimal" на Вашия език) CompactInstallation=Компактна инсталация CustomInstallation=Инсталация по избор NoUninstallWarningTitle=Компонентите съществуват NoUninstallWarning=Инсталаторът установи, че следните компоненти са вече инсталирани в компютърa:%n%n%1%n%nОтказването на тези компоненти няма да ги деинсталира.%n%nЖелаете ли все пак да продължите? ComponentSize1=%1 кБ ComponentSize2=%1 МБ +ComponentsDiskSpaceGBLabel=Направеният избор изисква поне [gb] ГБ дисково пространство. ComponentsDiskSpaceMBLabel=Направеният избор изисква поне [mb] МБ дисково пространство. ; *** Страница "Избор на допълнителни задачи" на съветника @@ -198,7 +200,7 @@ NoProgramGroupCheck2=И&нсталиране без папка в менюто " ; *** Страница "Готовност за инсталиране" на съветника WizardReady=Готовност за инсталиране -ReadyLabel1=Инсталаторът е готов да инсталира [name] във вашия компютър. +ReadyLabel1=Инсталаторът е готов да инсталира [name] във Вашия компютър. ReadyLabel2a=Натиснете "Инсталиране", за да продължите, или "Назад" за преглед или промяна на някои настройки. ReadyLabel2b=Натиснете "Инсталиране", за да продължите с инсталирането. ReadyMemoUserInfo=Данни за потребител: @@ -208,9 +210,21 @@ ReadyMemoComponents=Избрани компоненти: ReadyMemoGroup=Папка в менюто "Старт": ReadyMemoTasks=Допълнителни задачи: +; *** Страница "TDownloadWizardPage" на съветника и DownloadTemporaryFile +DownloadingLabel=Изтегляне на допълнителни файлове... +ButtonStopDownload=&Спри изтеглянето +StopDownload=Сигурни ли сте, че искате да спрете изтеглянето? +ErrorDownloadAborted=Изтеглянето беше прекъснато +ErrorDownloadFailed=Изтеглянето беше неуспешно: %1 %2 +ErrorDownloadSizeFailed=Неуспешно получаване на размер: %1 %2 +ErrorFileHash1=Неуспешна контролна сума на файл: %1 +ErrorFileHash2=Невалидна контролна сума на файл: очаквана %1, открита %2 +ErrorProgress=Невалиден напредък: %1 of %2 +ErrorFileSize=Невалиден размер на файл: очакван %1, открит %2 + ; *** Страница "Подготовка за инсталиране" на съветника WizardPreparing=Подготовка за инсталиране -PreparingDesc=Инсталаторът се подготвя да инсталира [name] във вашия компютър. +PreparingDesc=Инсталаторът се подготвя да инсталира [name] във Вашия компютър. PreviousInstallNotCompleted=Инсталиране или премахване на предишна програма не е завършило. Рестартирайте компютъра, за да може процесът да завърши.%n%nСлед като рестартирате, стартирайте инсталатора отново, за да довършите инсталирането на [name]. CannotContinue=Инсталирането не може да продължи. Моля, натиснете "Отказ" за изход. ApplicationsFound=Следните приложения използват файлове, които трябва да бъдат обновени от инсталатора. Препоръчва се да разрешите на инсталатора автоматично да затвори приложенията. @@ -218,15 +232,16 @@ ApplicationsFound2=Следните приложения използват фа CloseApplications=Приложенията да се затворят &автоматично DontCloseApplications=Приложенията да &не се затварят ErrorCloseApplications=Не бе възможно да се затворят автоматично всички приложения. Препоръчва се преди да продължите, да затворите всички приложения, използващи файлове, които инсталаторът трябва да обнови. +PrepareToInstallNeedsRestart=Инсталаторът трябва да ресартира Вашия компютър. След рестартирането, стартирайте инсталатора отново, за да завършите инсталацията на [name].%n%nЖелаете ли да рестартирате сега? ; *** Страница "Инсталиране" на съветника WizardInstalling=Инсталиране -InstallingLabel=Моля, изчакайте докато [name] се инсталира във вашия компютър. +InstallingLabel=Моля, изчакайте докато [name] се инсталира във Вашия компютър. ; *** Страница "Инсталирането завърши" на съветника FinishedHeadingLabel=Съветникът за инсталиране на [name] завърши -FinishedLabelNoIcons=Инсталирането на [name] във вашия компютър завърши. -FinishedLabel=Инсталирането на [name] във вашия компютър завърши. Можете да стартирате приложението чрез инсталираните икони. +FinishedLabelNoIcons=Инсталирането на [name] във Вашия компютър завърши. +FinishedLabel=Инсталирането на [name] във Вашия компютър завърши. Можете да стартирате приложението чрез инсталираните икони. ClickFinish=Натиснете "Готово", за да затворите инсталатора. FinishedRestartLabel=Инсталаторът трябва да рестартира компютъра, за да завърши инсталирането на [name]. Желаете ли да рестартирате сега? FinishedRestartMessage=Инсталаторът трябва да рестартира компютъра, за да завърши инсталирането на [name].%n%nЖелаете ли да рестартирате сега? @@ -289,8 +304,16 @@ ExistingFileReadOnly2=Съществуващият файл не беше зам ExistingFileReadOnlyRetry=&Премахни атрибута „само за четене“ и опитай отново ExistingFileReadOnlyKeepExisting=&Запази съществуващия файл ErrorReadingExistingDest=Грешка при опит за четене на съществуващ файл: -FileExists=Файлът вече съществува.%n%nЖелаете ли инсталаторът да го презапише? -ExistingFileNewer=Съществуващият файл е по-нов от този, който инсталаторът се опитва да инсталира. Препоръчва се да го запазите.%n%nЖелаете ли да запазите съществуващия файл? +FileExistsSelectAction=Изберете действие +FileExists2=Файлът вече съществува. +FileExistsOverwriteExisting=&Презапиши съществуващия файл +FileExistsKeepExisting=&Запази съществуващия файл +FileExistsOverwriteOrKeepAll=&Извършвай същото за останалите конфликти +ExistingFileNewerSelectAction=Изберете действие +ExistingFileNewer2=Съществуващият файл е по-нов от този, който инсталаторът се опитва да инсталира. +ExistingFileNewerOverwriteExisting=&Презапиши съществуващия файл +ExistingFileNewerKeepExisting=&Запази съществуващия файл (препоръчително) +ExistingFileNewerOverwriteOrKeepAll=&Извършвай същото за останалите конфликти ErrorChangingAttr=Грешка при опит за смяна на атрибути на съществуващ файл: ErrorCreatingTemp=Грешка при опит за създаване на файл в целевата директория: ErrorReadingSource=Грешка при опит за четене на файл - източник: @@ -322,10 +345,10 @@ UninstallUnknownEntry=Открит бе непознат запис (%1) в ре ConfirmUninstall=Наистина ли желаете да премахнете напълно %1 и всички прилежащи компоненти? UninstallOnlyOnWin64=Програмата може да бъде деинсталирана само под 64-битов Windows. OnlyAdminCanUninstall=Програмата може да бъде премахната само от потребител с администраторски права. -UninstallStatusLabel=Моля, изчакайте премахването на %1 от вашия компютър да приключи. -UninstalledAll=%1 беше премахната успешно от вашия компютър. +UninstallStatusLabel=Моля, изчакайте премахването на %1 от Вашия компютър да приключи. +UninstalledAll=%1 беше премахната успешно от Вашия компютър. UninstalledMost=Деинсталирането на %1 завърши.%n%nПремахването на някои елементи не бе възможно. Можете да ги отстраните ръчно. -UninstalledAndNeedsRestart=За да приключи деинсталирането на %1, трябва да рестартирате вашия компютър.%n%nЖелаете ли да рестартирате сега? +UninstalledAndNeedsRestart=За да приключи деинсталирането на %1, трябва да рестартирате Вашия компютър.%n%nЖелаете ли да рестартирате сега? UninstallDataCorrupted=Файлът "%1" е повреден. Деинсталирането е невъзможно ; *** Съобщения от фаза "Деинсталиране" diff --git a/installer/innosetup/Languages/Catalan.isl b/installer/innosetup/Languages/Catalan.isl new file mode 100644 index 000000000..5fc86822a --- /dev/null +++ b/installer/innosetup/Languages/Catalan.isl @@ -0,0 +1,371 @@ +; *** Inno Setup version 6.1.0+ Catalan messages *** +; +; Translated by Carles Millan (email: carles@carlesmillan.cat) +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno + +[LangOptions] + +LanguageName=Catal<00E0> +LanguageID=$0403 +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Installaci +SetupWindowTitle=Installaci - %1 +UninstallAppTitle=Desinstallaci +UninstallAppFullTitle=Desinstalla %1 + +; *** Misc. common +InformationTitle=Informaci +ConfirmTitle=Confirmaci +ErrorTitle=Error + +; *** SetupLdr messages +SetupLdrStartupMessage=Aquest programa installar %1. Voleu continuar? +LdrCannotCreateTemp=No s'ha pogut crear un fitxer temporal. Installaci cancellada +LdrCannotExecTemp=No s'ha pogut executar el fitxer a la carpeta temporal. Installaci cancellada +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nError %2: %3 +SetupFileMissing=El fitxer %1 no es troba a la carpeta d'installaci. Resoleu el problema o obteniu una nova cpia del programa. +SetupFileCorrupt=Els fitxers d'installaci estan corromputs. Obteniu una nova cpia del programa. +SetupFileCorruptOrWrongVer=Els fitxers d'installaci estan espatllats, o sn incompatibles amb aquesta versi del programa. Resoleu el problema o obteniu una nova cpia del programa. +InvalidParameter=Un parmetre invlid ha estat passat a la lnia de comanda:%n%n%1 +SetupAlreadyRunning=La installaci ja est en curs. +WindowsVersionNotSupported=Aquest programa no suporta la versi de Windows installada al vostre ordinador. +WindowsServicePackRequired=Aquest programa necessita %1 Service Pack %2 o posterior. +NotOnThisPlatform=Aquest programa no funcionar sota %1. +OnlyOnThisPlatform=Aquest programa noms pot ser executat sota %1. +OnlyOnTheseArchitectures=Aquest programa noms pot ser installat en versions de Windows dissenyades per a les segents arquitectures de processador:%n%n%1 +WinVersionTooLowError=Aquest programa requereix %1 versi %2 o posterior. +WinVersionTooHighError=Aquest programa no pot ser installat sota %1 versi %2 o posterior. +AdminPrivilegesRequired=Cal que tingueu privilegis d'administrador per poder installar aquest programa. +PowerUserPrivilegesRequired=Cal que accediu com a administrador o com a membre del grup Power Users en installar aquest programa. +SetupAppRunningError=El programa d'installaci ha detectat que %1 s'est executant actualment.%n%nTanqueu el programa i premeu Accepta per a continuar o Cancella per a sortir. +UninstallAppRunningError=El programa de desinstallaci ha detectat que %1 s'est executant en aquest moment.%n%nTanqueu el programa i premeu Accepta per a continuar o Cancella per a sortir. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Selecci del Mode d'Installaci +PrivilegesRequiredOverrideInstruction=Trieu mode d'installaci +PrivilegesRequiredOverrideText1=%1 pot ser installat per a tots els usuaris (cal tenir privilegis d'administrador), o noms per a vs. +PrivilegesRequiredOverrideText2=%1 pot ser installat noms per a vs, o per a tots els usuaris (cal tenir privilegis d'administrador). +PrivilegesRequiredOverrideAllUsers=Installaci per a &tots els usuaris +PrivilegesRequiredOverrideAllUsersRecommended=Installaci per a &tots els usuaris (recomanat) +PrivilegesRequiredOverrideCurrentUser=Installaci noms per a &mi +PrivilegesRequiredOverrideCurrentUserRecommended=Installaci noms per a &mi (recomanat) + +; *** Misc. errors +ErrorCreatingDir=El programa d'installaci no ha pogut crear la carpeta "%1" +ErrorTooManyFilesInDir=No s'ha pogut crear un fitxer a la carpeta "%1" perqu cont massa fitxers + +; *** Setup common messages +ExitSetupTitle=Surt +ExitSetupMessage=La installaci no s'ha completat. Si sortiu ara, el programa no ser installat.%n%nPer a completar-la podreu tornar a executar el programa d'installaci quan vulgueu.%n%nVoleu sortir-ne? +AboutSetupMenuItem=&Sobre la installaci... +AboutSetupTitle=Sobre la installaci +AboutSetupMessage=%1 versi %2%n%3%n%nPgina web de %1:%n%4 +AboutSetupNote= +TranslatorNote=Catalan translation by Carles Millan (carles at carlesmillan.cat) + +; *** Buttons +ButtonBack=< &Enrere +ButtonNext=&Segent > +ButtonInstall=&Installa +ButtonOK=Accepta +ButtonCancel=Cancella +ButtonYes=&S +ButtonYesToAll=S a &tot +ButtonNo=&No +ButtonNoToAll=N&o a tot +ButtonFinish=&Finalitza +ButtonBrowse=&Explora... +ButtonWizardBrowse=&Cerca... +ButtonNewFolder=Crea &nova carpeta + +; *** "Select Language" dialog messages +SelectLanguageTitle=Trieu idioma +SelectLanguageLabel=Trieu idioma a emprar durant la installaci. + +; *** Common wizard text +ClickNext=Premeu Segent per a continuar o Cancella per a abandonar la installaci. +BeveledLabel= +BrowseDialogTitle=Trieu una carpeta +BrowseDialogLabel=Trieu la carpeta de destinaci i premeu Accepta. +NewFolderName=Nova carpeta + +; *** "Welcome" wizard page +WelcomeLabel1=Benvingut a l'assistent d'installaci de [name] +WelcomeLabel2=Aquest programa installar [name/ver] al vostre ordinador.%n%ns molt recomanable que abans de continuar tanqueu tots els altres programes oberts, per tal d'evitar conflictes durant el procs d'installaci. + +; *** "Password" wizard page +WizardPassword=Contrasenya +PasswordLabel1=Aquesta installaci est protegida amb una contrasenya. +PasswordLabel3=Indiqueu la contrasenya i premeu Segent per a continuar. Aquesta contrasenya distingeix entre majscules i minscules. +PasswordEditLabel=&Contrasenya: +IncorrectPassword=La contrasenya introduda no s correcta. Torneu-ho a intentar. + +; *** "License Agreement" wizard page +WizardLicense=Acord de Llicncia +LicenseLabel=Cal que llegiu aquesta informaci abans de continuar. +LicenseLabel3=Cal que llegiu l'Acord de Llicncia segent. Cal que n'accepteu els termes abans de continuar amb la installaci. +LicenseAccepted=&Accepto l'acord +LicenseNotAccepted=&No accepto l'acord + +; *** "Information" wizard pages +WizardInfoBefore=Informaci +InfoBeforeLabel=Llegiu la informaci segent abans de continuar. +InfoBeforeClickLabel=Quan estigueu preparat per a continuar, premeu Segent. +WizardInfoAfter=Informaci +InfoAfterLabel=Llegiu la informaci segent abans de continuar. +InfoAfterClickLabel=Quan estigueu preparat per a continuar, premeu Segent + +; *** "User Information" wizard page +WizardUserInfo=Informaci sobre l'usuari +UserInfoDesc=Introduu la vostra informaci. +UserInfoName=&Nom de l'usuari: +UserInfoOrg=&Organitzaci +UserInfoSerial=&Nmero de srie: +UserInfoNameRequired=Cal que hi introduu un nom + +; *** "Select Destination Location" wizard page +WizardSelectDir=Trieu Carpeta de Destinaci +SelectDirDesc=On s'ha d'installar [name]? +SelectDirLabel3=El programa d'installaci installar [name] a la carpeta segent. +SelectDirBrowseLabel=Per a continuar, premeu Segent. Si desitgeu triar una altra capeta, premeu Cerca. +DiskSpaceGBLabel=Aquest programa necessita un mnim de [gb] GB d'espai a disc. +DiskSpaceMBLabel=Aquest programa necessita un mnim de [mb] MB d'espai a disc. +CannotInstallToNetworkDrive=La installaci no es pot fer en un disc de xarxa. +CannotInstallToUNCPath=La installaci no es pot fer a una ruta UNC. +InvalidPath=Cal donar una ruta completa amb lletra d'unitat, per exemple:%n%nC:\Aplicaci%n%no b una ruta UNC en la forma:%n%n\\servidor\compartit +InvalidDrive=El disc o ruta de xarxa seleccionat no existeix, trieu-ne un altre. +DiskSpaceWarningTitle=No hi ha prou espai al disc +DiskSpaceWarning=El programa d'installaci necessita com a mnim %1 KB d'espai lliure, per el disc seleccionat noms t %2 KB disponibles.%n%nTot i amb aix, desitgeu continuar? +DirNameTooLong=El nom de la carpeta o de la ruta s massa llarg. +InvalidDirName=El nom de la carpeta no s vlid. +BadDirName32=Un nom de carpeta no pot contenir cap dels carcters segents:%n%n%1 +DirExistsTitle=La carpeta existeix +DirExists=La carpeta:%n%n%1%n%nja existeix. Voleu installar igualment el programa en aquesta carpeta? +DirDoesntExistTitle=La Carpeta No Existeix +DirDoesntExist=La carpeta:%n%n%1%n%nno existeix. Voleu que sigui creada? + +; *** "Select Program Group" wizard page +WizardSelectComponents=Trieu Components +SelectComponentsDesc=Quins components cal installar? +SelectComponentsLabel2=Trieu els components que voleu installar; elimineu els components que no voleu installar. Premeu Segent per a continuar. +FullInstallation=Installaci completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Installaci compacta +CustomInstallation=Installaci personalitzada +NoUninstallWarningTitle=Els components Existeixen +NoUninstallWarning=El programa d'installaci ha detectat que els components segents ja es troben al vostre ordinador:%n%n%1%n%nSi no estan seleccionats no seran desinstallats.%n%nVoleu continuar igualment? +ComponentSize1=%1 Kb +ComponentSize2=%1 Mb +ComponentsDiskSpaceGBLabel=Aquesta selecci requereix un mnim de [gb] GB d'espai al disc. +ComponentsDiskSpaceMBLabel=Aquesta selecci requereix un mnim de [mb] Mb d'espai al disc. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Trieu tasques addicionals +SelectTasksDesc=Quines tasques addicionals cal executar? +SelectTasksLabel2=Trieu les tasques addicionals que voleu que siguin executades mentre s'installa [name], i desprs premeu Segent. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Trieu la carpeta del Men Inici +SelectStartMenuFolderDesc=On cal situar els enllaos del programa? +SelectStartMenuFolderLabel3=El programa d'installaci crear l'accs directe al programa a la segent carpeta del men d'Inici. +SelectStartMenuFolderBrowseLabel=Per a continuar, premeu Segent. Si desitgeu triar una altra carpeta, premeu Cerca. +MustEnterGroupName=Cal que hi introduu un nom de carpeta. +GroupNameTooLong=El nom de la carpeta o de la ruta s massa llarg. +InvalidGroupName=El nom de la carpeta no s vlid. +BadGroupName=El nom del grup no pot contenir cap dels carcters segents:%n%n%1 +NoProgramGroupCheck2=&No cres una carpeta al Men Inici + +; *** "Ready to Install" wizard page +WizardReady=Preparat per a installar +ReadyLabel1=El programa d'installaci est preparat per a iniciar la installaci de [name] al vostre ordinador. +ReadyLabel2a=Premeu Installa per a continuar amb la installaci, o Enrere si voleu revisar o modificar les opcions d'installaci. +ReadyLabel2b=Premeu Installa per a continuar amb la installaci. +ReadyMemoUserInfo=Informaci de l'usuari: +ReadyMemoDir=Carpeta de destinaci: +ReadyMemoType=Tipus d'installaci: +ReadyMemoComponents=Components seleccionats: +ReadyMemoGroup=Carpeta del Men Inici: +ReadyMemoTasks=Tasques addicionals: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Descarregant els fitxers addicionals... +ButtonStopDownload=&Atura la descrrega +StopDownload=Esteu segur que voleu aturar la descrrega? +ErrorDownloadAborted=Descrrega cancellada +ErrorDownloadFailed=La descrrega ha fallat: %1 %2 +ErrorDownloadSizeFailed=La mesura de la descrrega ha fallat: %1 %2 +ErrorFileHash1=El hash del fitxer ha fallat: %1 +ErrorFileHash2=El hash del fitxer s invlid: s'esperava %1, s'ha trobat %2 +ErrorProgress=Progrs invlid: %1 de %2 +ErrorFileSize=Mida del fitxer invlida: s'esperava %1, s'ha trobat %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparant la installaci +PreparingDesc=Preparant la installaci de [name] al vostre ordinador. +PreviousInstallNotCompleted=La installaci o desinstallaci anterior no s'ha dut a terme. Caldr que reinicieu l'ordinador per a finalitzar aquesta installaci.%n%nDesprs de reiniciar l'ordinador, executeu aquest programa de nou per completar la installaci de [name]. +CannotContinue=La installaci no pot continuar. Premeu Cancella per a sortir. +ApplicationsFound=Les segents aplicacions estan fent servir fitxers que necessiten ser actualitzats per la installaci. Es recomana que permeteu a la installaci tancar automticament aquestes aplicacions. +ApplicationsFound2=Les segents aplicacions estan fent servir fitxers que necessiten ser actualitzats per la installaci. Es recomana que permeteu a la installaci tancar automticament aquestes aplicacions. Desprs de completar la installaci s'intentar reiniciar les aplicacions. +CloseApplications=&Tanca automticament les aplicacions +DontCloseApplications=&No tanquis les aplicacions +ErrorCloseApplications=El programa d'installaci no ha pogut tancar automticament totes les aplicacions. Es recomana que abans de continuar tanqueu totes les aplicacions que estan usant fitxers que han de ser actualitzats pel programa d'installaci. +PrepareToInstallNeedsRestart=El programa d'installaci ha de reiniciar l'ordinador. Desprs del reinici, executeu de nou l'installador per tal de completar la installaci de [name].%n%nVoleu reiniciar-lo ara? + +; *** "Installing" wizard page +WizardInstalling=Installant +InstallingLabel=Espereu mentre s'installa [name] al vostre ordinador. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Completant l'assistent d'installaci de [name] +FinishedLabelNoIcons=El programa ha finalitzat la installaci de [name] al vostre ordinador. +FinishedLabel=El programa ha finalitzat la installaci de [name] al vostre ordinador. L'aplicaci pot ser iniciada seleccionant les icones installades. +ClickFinish=Premeu Finalitza per a sortir de la installaci. +FinishedRestartLabel=Per a completar la installaci de [name] cal reiniciar l'ordinador. Voleu fer-ho ara? +FinishedRestartMessage=Per a completar la installaci de [name] cal reiniciar l'ordinador. Voleu fer-ho ara? +ShowReadmeCheck=S, vull visualitzar el fitxer LLEGIUME.TXT +YesRadio=&S, reiniciar l'ordinador ara +NoRadio=&No, reiniciar l'ordinador ms tard +; used for example as 'Run MyProg.exe' +RunEntryExec=Executa %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Visualitza %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=El programa d'installaci necessita el disc segent +SelectDiskLabel2=Introduiu el disc %1 i premeu Continua.%n%nSi els fitxers d'aquest disc es poden trobar en una carpeta diferent de la indicada tot seguit, introduu-ne la ruta correcta o b premeu Explora. +PathLabel=&Ruta: +FileNotInDir2=El fitxer "%1" no s'ha pogut trobar a "%2". Introduu el disc correcte o trieu una altra carpeta. +SelectDirectoryLabel=Indiqueu on es troba el disc segent. + +; *** Installation phase messages +SetupAborted=La installaci no s'ha completat.%n%n%Resoleu el problema i executeu de nou el programa d'installaci. +AbortRetryIgnoreSelectAction=Trieu acci +AbortRetryIgnoreRetry=&Torna-ho a intentar +AbortRetryIgnoreIgnore=&Ignora l'error i continua +AbortRetryIgnoreCancel=Cancella la installaci + +; *** Installation status messages +StatusClosingApplications=Tancant aplicacions... +StatusCreateDirs=Creant carpetes... +StatusExtractFiles=Extraient fitxers... +StatusCreateIcons=Creant enllaos del programa... +StatusCreateIniEntries=Creant entrades al fitxer INI... +StatusCreateRegistryEntries=Creant entrades de registre... +StatusRegisterFiles=Registrant fitxers... +StatusSavingUninstall=Desant informaci de desinstallaci... +StatusRunProgram=Finalitzant la installaci... +StatusRestartingApplications=Reiniciant aplicacions... +StatusRollback=Desfent els canvis... + +; *** Misc. errors +ErrorInternal2=Error intern: %1 +ErrorFunctionFailedNoCode=%1 ha fallat +ErrorFunctionFailed=%1 ha fallat; codi %2 +ErrorFunctionFailedWithMessage=%1 ha fallat; codi %2.%n%3 +ErrorExecutingProgram=No es pot executar el fitxer:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Error en obrir la clau de registre:%n%1\%2 +ErrorRegCreateKey=Error en crear la clau de registre:%n%1\%2 +ErrorRegWriteKey=Error en escriure a la clau de registre:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Error en crear l'entrada INI al fitxer "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Salta't aquest fitxer (no recomanat) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignora l'error i continua (no recomanat) +SourceIsCorrupted=El fitxer d'origen est corromput +SourceDoesntExist=El fitxer d'origen "%1" no existeix +ExistingFileReadOnly2=El fitxer existent no ha pogut ser substitut perqu est marcat com a noms lectura. +ExistingFileReadOnlyRetry=&Lleveu-li l'atribut de noms lectura i torneu-ho a intentar +ExistingFileReadOnlyKeepExisting=&Mant el fitxer existent +ErrorReadingExistingDest=S'ha produt un error en llegir el fitxer: +FileExistsSelectAction=Trieu acci +FileExists2=El fitxer ja existeix. +FileExistsOverwriteExisting=&Sobreescriu el fitxer existent +FileExistsKeepExisting=&Mant el fitxer existent +FileExistsOverwriteOrKeepAll=&Fes-ho tamb per als propers conflictes +ExistingFileNewerSelectAction=Trieu acci +ExistingFileNewer2=El fitxer existent s ms nou que el que s'intenta installar. +ExistingFileNewerOverwriteExisting=&Sobreescriu el fitxer existent +ExistingFileNewerKeepExisting=&Mant el fitxer existent (recomanat) +ExistingFileNewerOverwriteOrKeepAll=&Fes-ho tamb per als propers conflictes +ErrorChangingAttr=Hi ha hagut un error en canviar els atributs del fitxer: +ErrorCreatingTemp=Hi ha hagut un error en crear un fitxer a la carpeta de destinaci: +ErrorReadingSource=Hi ha hagut un error en llegir el fitxer d'origen: +ErrorCopying=Hi ha hagut un error en copiar un fitxer: +ErrorReplacingExistingFile=Hi ha hagut un error en reemplaar el fitxer existent: +ErrorRestartReplace=Ha fallat reemplaar: +ErrorRenamingTemp=Hi ha hagut un error en reanomenar un fitxer a la carpeta de destinaci: +ErrorRegisterServer=No s'ha pogut registrar el DLL/OCX: %1 +ErrorRegSvr32Failed=Ha fallat RegSvr32 amb el codi de sortida %1 +ErrorRegisterTypeLib=No s'ha pogut registrar la biblioteca de tipus: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Tots els usuaris +UninstallDisplayNameMarkCurrentUser=Usuari actual + +; *** Post-installation errors +ErrorOpeningReadme=Hi ha hagut un error en obrir el fitxer LLEGIUME.TXT. +ErrorRestartingComputer=El programa d'installaci no ha pogut reiniciar l'ordinador. Cal que ho feu manualment. + +; *** Uninstaller messages +UninstallNotFound=El fitxer "%1" no existeix. No es pot desinstallar. +UninstallOpenError=El fitxer "%1" no pot ser obert. No es pot desinstallar +UninstallUnsupportedVer=El fitxer de desinstallaci "%1" est en un format no reconegut per aquesta versi del desinstallador. No es pot desinstallar +UninstallUnknownEntry=S'ha trobat una entrada desconeguda (%1) al fitxer de desinstallaci. +ConfirmUninstall=Esteu segur de voler eliminar completament %1 i tots els seus components? +UninstallOnlyOnWin64=Aquest programa noms pot ser desinstallat en Windows de 64 bits. +OnlyAdminCanUninstall=Aquest programa noms pot ser desinstallat per un usuari amb privilegis d'administrador. +UninstallStatusLabel=Espereu mentre s'elimina %1 del vostre ordinador. +UninstalledAll=%1 ha estat desinstallat correctament del vostre ordinador. +UninstalledMost=Desinstallaci de %1 completada.%n%nAlguns elements no s'han pogut eliminar. Poden ser eliminats manualment. +UninstalledAndNeedsRestart=Per completar la installaci de %1, cal reiniciar el vostre ordinador.%n%nVoleu fer-ho ara? +UninstallDataCorrupted=El fitxer "%1" est corromput. No es pot desinstallar. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Eliminar fitxer compartit? +ConfirmDeleteSharedFile2=El sistema indica que el fitxer compartit segent ja no s emprat per cap altre programa. Voleu que la desinstallaci elimini aquest fitxer?%n%nSi algun programa encara el fa servir i s eliminat, podria no funcionar correctament. Si no n'esteu segur, trieu No. Deixar el fitxer al sistema no far cap mal. +SharedFileNameLabel=Nom del fitxer: +SharedFileLocationLabel=Localitzaci: +WizardUninstalling=Estat de la desinstallaci +StatusUninstalling=Desinstallant %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installant %1. +ShutdownBlockReasonUninstallingApp=Desinstallant %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versi %2 +AdditionalIcons=Icones addicionals: +CreateDesktopIcon=Crea una icona a l'&Escriptori +CreateQuickLaunchIcon=Crea una icona a la &Barra de tasques +ProgramOnTheWeb=%1 a Internet +UninstallProgram=Desinstalla %1 +LaunchProgram=Obre %1 +AssocFileExtension=&Associa %1 amb l'extensi de fitxer %2 +AssocingFileExtension=Associant %1 amb l'extensi de fitxer %2... +AutoStartProgramGroupDescription=Inici: +AutoStartProgram=Inicia automticament %1 +AddonHostProgramNotFound=%1 no ha pogut ser trobat a la carpeta seleccionada.%n%nVoleu continuar igualment? diff --git a/installer/innosetup/Languages/ChineseSimplified.isl b/installer/innosetup/Languages/ChineseSimplified.isl index 1835c4f30..df711d51d 100644 --- a/installer/innosetup/Languages/ChineseSimplified.isl +++ b/installer/innosetup/Languages/ChineseSimplified.isl @@ -1,4 +1,12 @@ -; *** Inno Setup version 6.0.3+ Chinese Simplified messages *** +; *** Inno Setup version 6.1.0+ Chinese Simplified messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). ; ; Maintained by Zhenghan Yang ; Email: 847320916@QQ.com @@ -12,6 +20,8 @@ LanguageName=简体中文 ; If Language Name display incorrect, uncomment next line ; LanguageName=<7B80><4F53><4E2D><6587> +; About LanguageID, to reference link: +; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c LanguageID=$0804 LanguageCodePage=936 ; If the language you are translating to requires special font faces or @@ -46,22 +56,22 @@ HelpTextNote= ; *** 启动错误消息 LastErrorMessage=%1.%n%n错误 %2: %3 -SetupFileMissing=安装目录中的文件 %1 丢失。请修正这个问题或获取一个新的程序副本。 -SetupFileCorrupt=安装文件已损坏。请获取一个新的程序副本。 +SetupFileMissing=安装目录中的文件 %1 丢失。请修正这个问题或者获取程序的新副本。 +SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。 SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。 -InvalidParameter=无效的命令行参数: %n%n%1 +InvalidParameter=无效的命令行参数:%n%n%1 SetupAlreadyRunning=安装程序正在运行。 -WindowsVersionNotSupported=这个程序不支持该版本的计算机运行。 -WindowsServicePackRequired=这个程序要求%1服务包%1或更高。 +WindowsVersionNotSupported=这个程序不支持当前计算机运行的Windows版本。 +WindowsServicePackRequired=这个程序需要 %1 服务包 %2 或更高。 NotOnThisPlatform=这个程序将不能运行于 %1。 OnlyOnThisPlatform=这个程序必须运行于 %1。 -OnlyOnTheseArchitectures=这个程序只能在为下列处理器结构设计的 Windows 版本中进行安装:%n%n%1 +OnlyOnTheseArchitectures=这个程序只能在为下列处理器结构设计的Windows版本中进行安装:%n%n%1 WinVersionTooLowError=这个程序需要 %1 版本 %2 或更高。 WinVersionTooHighError=这个程序不能安装于 %1 版本 %2 或更高。 AdminPrivilegesRequired=在安装这个程序时您必须以管理员身份登录。 PowerUserPrivilegesRequired=在安装这个程序时您必须以管理员身份或有权限的用户组身份登录。 -SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭所有运行的窗口,然后单击“确定”继续,或按“取消”退出。 -UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭所有运行的窗口,然后单击“确定”继续,或按“取消”退出。 +SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭所有运行的窗口,然后点击“确定”继续,或按“取消”退出。 +UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭所有运行的窗口,然后点击“确定”继续,或按“取消”退出。 ; *** 启动问题 PrivilegesRequiredOverrideTitle=选择安装程序模式 @@ -69,9 +79,9 @@ PrivilegesRequiredOverrideInstruction=选择安装模式 PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。 PrivilegesRequiredOverrideText2=%1 只能为您安装,或为所有用户安装(需要管理员权限)。 PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A) -PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(建议选项)(&A) +PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项) PrivilegesRequiredOverrideCurrentUser=只为我安装(&M) -PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(建议选项)(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项) ; *** 其它错误 ErrorCreatingDir=安装程序不能创建目录“%1”。 @@ -79,10 +89,10 @@ ErrorTooManyFilesInDir=不能在目录“%1”中创建文件,因为里面的 ; *** 安装程序公共消息 ExitSetupTitle=退出安装程序 -ExitSetupMessage=安装程序未完成安装。如果您现在退出,您的程序将不能安装。%n%n您可以以后再运行安装程序完成安装。%n%n退出安装程序吗? +ExitSetupMessage=安装程序还未完成安装。如果您现在退出,程序将不能安装。%n%n您可以以后再运行安装程序完成安装。%n%n现在退出安装程序吗? AboutSetupMenuItem=关于安装程序(&A)... AboutSetupTitle=关于安装程序 -AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 +AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 AboutSetupNote= TranslatorNote= @@ -106,10 +116,10 @@ SelectLanguageTitle=选择安装语言 SelectLanguageLabel=选择安装时要使用的语言。 ; *** 公共向导文字 -ClickNext=单击“下一步”继续,或单击“取消”退出安装程序。 +ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。 BeveledLabel= BrowseDialogTitle=浏览文件夹 -BrowseDialogLabel=在下列列表中选择一个文件夹,然后单击“确定”。 +BrowseDialogLabel=在下列列表中选择一个文件夹,然后点击“确定”。 NewFolderName=新建文件夹 ; *** “欢迎”向导页 @@ -119,9 +129,9 @@ WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n推荐您在 ; *** “密码”向导页 WizardPassword=密码 PasswordLabel1=这个安装程序有密码保护。 -PasswordLabel3=请输入密码,然后单击“下一步”继续。密码区分大小写。 -PasswordEditLabel=密码(&P): -IncorrectPassword=您输入的密码不正确,请重试。 +PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。 +PasswordEditLabel=密码(&P): +IncorrectPassword=您所输入的密码不正确,请重试。 ; *** “许可协议”向导页 WizardLicense=许可协议 @@ -133,50 +143,50 @@ LicenseNotAccepted=我不同意此协议(&D) ; *** “信息”向导页 WizardInfoBefore=信息 InfoBeforeLabel=请在继续安装前阅读下列重要信息。 -InfoBeforeClickLabel=如果您想继续安装,单击“下一步”。 +InfoBeforeClickLabel=如果您想继续安装,点击“下一步”。 WizardInfoAfter=信息 InfoAfterLabel=请在继续安装前阅读下列重要信息。 -InfoAfterClickLabel=如果您想继续安装,单击“下一步”。 +InfoAfterClickLabel=如果您想继续安装,点击“下一步”。 ; *** “用户信息”向导页 WizardUserInfo=用户信息 UserInfoDesc=请输入您的信息。 -UserInfoName=用户名(&U): -UserInfoOrg=组织(&O): -UserInfoSerial=序列号(&S): -UserInfoNameRequired=您必须输入名字。 +UserInfoName=用户名(&U): +UserInfoOrg=组织(&O): +UserInfoSerial=序列号(&S): +UserInfoNameRequired=您必须输入用户名。 -; *** “选择目标目录”向导面 +; *** “选择目标目录”向导页 WizardSelectDir=选择目标位置 -SelectDirDesc=您想将 [name] 安装在什么地方? +SelectDirDesc=您想将 [name] 安装在哪里? SelectDirLabel3=安装程序将安装 [name] 到下列文件夹中。 -SelectDirBrowseLabel=单击“下一步”继续。如果您想选择其它文件夹,单击“浏览”。 +SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其它文件夹,点击“浏览”。 DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。 DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。 CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。 CannotInstallToUNCPath=安装程序无法安装到一个UNC路径。 -InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或下列形式的 UNC 路径:%n%n\\server\share +InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或下列形式的UNC路径:%n%n\\server\share InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选选择其它位置。 DiskSpaceWarningTitle=没有足够的磁盘空间 DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗? -DirNameTooLong=文件夹名或路径太长。 -InvalidDirName=文件夹名是无效的。 -BadDirName32=文件夹名不能包含下列任何字符:%n%n%1 -DirExistsTitle=文件夹存在 -DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗? +DirNameTooLong=文件夹名称或路径太长。 +InvalidDirName=文件夹名称无效。 +BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1 +DirExistsTitle=文件夹已存在 +DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗? DirDoesntExistTitle=文件夹不存在 -DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此目录吗? +DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗? ; *** “选择组件”向导页 WizardSelectComponents=选择组件 SelectComponentsDesc=您想安装哪些程序的组件? -SelectComponentsLabel2=选择您想要安装的组件;清除您不想安装的组件。然后单击“下一步”继续。 +SelectComponentsLabel2=选择您想要安装的组件;清除您不想安装的组件。然后点击“下一步”继续。 FullInstallation=完全安装 ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=简洁安装 CustomInstallation=自定义安装 -NoUninstallWarningTitle=组件存在 -NoUninstallWarning=安装程序侦测到下列组件已在您的电脑中安装。:%n%n%1%n%n取消选定这些组件将不能卸载它们。%n%n您一定要继续吗? +NoUninstallWarningTitle=组件已存在 +NoUninstallWarning=安装程序检测到下列组件已在您的电脑中安装:%n%n%1%n%n取消选定这些组件将不能卸载它们。%n%n您一定要继续吗? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceGBLabel=当前选择的组件至少需要 [gb] GB 的磁盘空间。 @@ -185,40 +195,52 @@ ComponentsDiskSpaceMBLabel=当前选择的组件至少需要 [mb] MB 的磁盘 ; *** “选择附加任务”向导页 WizardSelectTasks=选择附加任务 SelectTasksDesc=您想要安装程序执行哪些附加任务? -SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后单击“下一步”。 +SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。 ; *** “选择开始菜单文件夹”向导页 WizardSelectProgramGroup=选择开始菜单文件夹 -SelectStartMenuFolderDesc=您想在哪里放置程序的快捷方式? +SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式? SelectStartMenuFolderLabel3=安装程序现在将在下列开始菜单文件夹中创建程序的快捷方式。 -SelectStartMenuFolderBrowseLabel=单击“下一步”继续。如果您想选择其它文件夹,单击“浏览”。 +SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其它文件夹,点击“浏览”。 MustEnterGroupName=您必须输入一个文件夹名。 GroupNameTooLong=文件夹名或路径太长。 InvalidGroupName=文件夹名是无效的。 -BadGroupName=文件夹名不能包含下列任何字符:%n%n%1 +BadGroupName=文件夹名不能包含下列任何字符:%n%n%1 NoProgramGroupCheck2=不创建开始菜单文件夹(&D) ; *** “准备安装”向导页 WizardReady=准备安装 ReadyLabel1=安装程序现在准备开始安装 [name] 到您的电脑中。 -ReadyLabel2a=单击“安装”继续此安装程序。如果您想要回顾或改变设置,请单击“上一步”。 -ReadyLabel2b=单击“安装”继续此安装程序? -ReadyMemoUserInfo=用户信息: -ReadyMemoDir=目标位置: -ReadyMemoType=安装类型: -ReadyMemoComponents=选定组件: -ReadyMemoGroup=开始菜单文件夹: -ReadyMemoTasks=附加任务: +ReadyLabel2a=点击“安装”继续此安装程序。如果您想要回顾或修改设置,请点击“上一步”。 +ReadyLabel2b=点击“安装”继续此安装程序? +ReadyMemoUserInfo=用户信息: +ReadyMemoDir=目标位置: +ReadyMemoType=安装类型: +ReadyMemoComponents=选定组件: +ReadyMemoGroup=开始菜单文件夹: +ReadyMemoTasks=附加任务: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=正在下载附加文件... +ButtonStopDownload=停止下载(&S) +StopDownload=您确定要停止下载吗? +ErrorDownloadAborted=下载已中止 +ErrorDownloadFailed=下载失败:%1 %2 +ErrorDownloadSizeFailed=获取下载大小失败:%1 %2 +ErrorFileHash1=校验文件哈希失败:%1 +ErrorFileHash2=无效的文件哈希:预期 %1,实际 %2 +ErrorProgress=无效的进度:%1,总共%2 +ErrorFileSize=文件大小错误:预期 %1,实际 %2 ; *** “正在准备安装”向导页 WizardPreparing=正在准备安装 PreparingDesc=安装程序正在准备安装 [name] 到您的电脑中。 PreviousInstallNotCompleted=先前程序的安装/卸载未完成。您需要重新启动您的电脑才能完成安装。%n%n在重新启动电脑后,再运行安装完成 [name] 的安装。 -CannotContinue=安装程序不能继续。请单击“取消”退出。 +CannotContinue=安装程序不能继续。请点击“取消”退出。 ApplicationsFound=下列应用程序正在使用的文件需要更新设置。它是建议您允许安装程序自动关闭这些应用程序。 ApplicationsFound2=下列应用程序正在使用的文件需要更新设置。它是建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动应用程序。 CloseApplications=自动关闭该应用程序(&A) -DontCloseApplications=不要关闭该应用程序(D) +DontCloseApplications=不要关闭该应用程序(&D) ErrorCloseApplications=安装程序无法自动关闭所有应用程序。在继续之前,我们建议您关闭所有使用需要更新的安装程序文件。 PrepareToInstallNeedsRestart=安装程序必须重新启动计算机。重新启动计算机后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动? @@ -230,27 +252,27 @@ InstallingLabel=安装程序正在安装 [name] 到您的电脑中,请稍等 FinishedHeadingLabel=[name] 安装完成 FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。 FinishedLabel=安装程序已在您的电脑中安装了 [name]。此应用程序可以通过选择安装的快捷方式运行。 -ClickFinish=单击“完成”退出安装程序。 -FinishedRestartLabel=要完成 [name] 的安装,安装程序必须重新启动您的电脑。您想现在重新启动吗? -FinishedRestartMessage=要完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n您想现在重新启动吗? -ShowReadmeCheck=是,您想查阅自述文件 +ClickFinish=点击“完成”退出安装程序。 +FinishedRestartLabel=要完成 [name] 的安装,安装程序必须重新启动您的电脑。您想要立即重新启动吗? +FinishedRestartMessage=要完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n您想要立即重新启动吗? +ShowReadmeCheck=是,我想查阅自述文件 YesRadio=是,立即重新启动电脑(&Y) NoRadio=否,稍后重新启动电脑(&N) -; 用于象“运行 MyProg.exe” +; used for example as 'Run MyProg.exe' RunEntryExec=运行 %1 -; 用于象“查阅 Readme.txt” +; used for example as 'View Readme.txt' RunEntryShellExec=查阅 %1 ; *** “安装程序需要下一张磁盘”提示 ChangeDiskTitle=安装程序需要下一张磁盘 -SelectDiskLabel2=请插入磁盘 %1 并单击“确定”。%n%n如果这个磁盘中的文件不能在不同于下列显示的文件夹中找到,输入正确的路径或单击“浏览”。 -PathLabel=路径(&P): +SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。 +PathLabel=路径(&P): FileNotInDir2=文件“%1”不能在“%2”定位。请插入正确的磁盘或选择其它文件夹。 SelectDirectoryLabel=请指定下一张磁盘的位置。 ; *** 安装状态消息 SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。 -AbortRetryIgnoreSelectAction=选项 +AbortRetryIgnoreSelectAction=选择操作 AbortRetryIgnoreRetry=重试(&T) AbortRetryIgnoreIgnore=忽略错误并继续(&I) AbortRetryIgnoreCancel=关闭安装程序 @@ -269,41 +291,49 @@ StatusRestartingApplications=正在重启应用程序... StatusRollback=正在撤销更改... ; *** 其它错误 -ErrorInternal2=内部错误: %1 +ErrorInternal2=内部错误:%1 ErrorFunctionFailedNoCode=%1 失败 ErrorFunctionFailed=%1 失败;错误代码 %2 ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3 -ErrorExecutingProgram=不能执行文件:%n%1 +ErrorExecutingProgram=不能执行文件:%n%1 ; *** 注册表错误 -ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 -ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 -ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 +ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 +ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 +ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 ; *** INI 错误 -ErrorIniEntry=在文件“%1”创建 INI 项目错误。 +ErrorIniEntry=在文件“%1”中创建INI条目时出错。 ; *** 文件复制错误 -FileAbortRetryIgnoreSkipNotRecommended=跳过这个文件 (不推荐)(&S) -FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续 (不推荐)(&I) +FileAbortRetryIgnoreSkipNotRecommended=跳过这个文件(&S) (不推荐) +FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐) SourceIsCorrupted=源文件已损坏 SourceDoesntExist=源文件“%1”不存在 ExistingFileReadOnly2=无法替换现有文件,因为它是只读的。 ExistingFileReadOnlyRetry=移除只读属性并重试(&R) ExistingFileReadOnlyKeepExisting=保留现有文件(&K) -ErrorReadingExistingDest=尝试读取现有文件时发生一个错误: -FileExists=文件已经存在。%n%n您想要安装程序覆盖它吗? -ExistingFileNewer=现有的文件新与安装程序要安装的文件。推荐您保留现有文件。%n%n您想要保留现有的文件吗? -ErrorChangingAttr=尝试改变下列现有的文件的属性时发生一个错误: -ErrorCreatingTemp=尝试在目标目录创建文件时发生一个错误: -ErrorReadingSource=尝试读取下列源文件时发生一个错误: -ErrorCopying=尝试复制下列文件时发生一个错误: -ErrorReplacingExistingFile=尝试替换现有的文件时发生错误: -ErrorRestartReplace=重启电脑后替换文件失败: -ErrorRenamingTemp=尝试重新命名以下目标目录中的一个文件时发生错误: -ErrorRegisterServer=不能注册 DLL/OCX: %1 +ErrorReadingExistingDest=尝试读取现有文件时出错: +FileExistsSelectAction=选择操作 +FileExists2=文件已经存在。 +FileExistsOverwriteExisting=覆盖已经存在的文件(&O) +FileExistsKeepExisting=保留现有的文件(&K) +FileExistsOverwriteOrKeepAll=为所有的冲突文件执行此操作(&D) +ExistingFileNewerSelectAction=选择操作 +ExistingFileNewer2=现有的文件比安装程序将要安装的文件更新。 +ExistingFileNewerOverwriteExisting=覆盖已经存在的文件(&O) +ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐) +ExistingFileNewerOverwriteOrKeepAll=为所有的冲突文件执行此操作(&D) +ErrorChangingAttr=尝试改变下列现有的文件的属性时出错: +ErrorCreatingTemp=尝试在目标目录创建文件时出错: +ErrorReadingSource=尝试读取下列源文件时出错: +ErrorCopying=尝试复制下列文件时出错: +ErrorReplacingExistingFile=尝试替换现有的文件时出错: +ErrorRestartReplace=重新启动替换失败: +ErrorRenamingTemp=尝试重新命名以下目标目录中的一个文件时出错: +ErrorRegisterServer=无法注册 DLL/OCX:%1 ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1 -ErrorRegisterTypeLib=不能注册类型库: %1 +ErrorRegisterTypeLib=无法注册类型库:%1 ; *** 卸载显示名字标记 ; used for example as 'My Program (32-bit)' @@ -316,34 +346,34 @@ UninstallDisplayNameMarkAllUsers=所有用户 UninstallDisplayNameMarkCurrentUser=当前用户 ; *** 安装后错误 -ErrorOpeningReadme=当尝试打开自述文件时发生一个错误。 +ErrorOpeningReadme=尝试打开自述文件时出错。 ErrorRestartingComputer=安装程序不能重新启动电脑,请手动重启。 ; *** 卸载消息 -UninstallNotFound=文件“%1”不存在。不能卸载。 -UninstallOpenError=文件“%1”不能打开。不能卸载。 -UninstallUnsupportedVer=卸载日志文件“%1”有未被这个版本的卸载器承认的格式。不能卸载 +UninstallNotFound=文件“%1”不存在。无法卸载。 +UninstallOpenError=文件“%1”不能打开。无法卸载。 +UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载 UninstallUnknownEntry=在卸载日志中遇到一个未知的条目 (%1) ConfirmUninstall=您确认想要完全删除 %1 及它的所有组件吗? -UninstallOnlyOnWin64=这个安装程序只能在 64 位 Windows 中进行卸载。 -OnlyAdminCanUninstall=这个安装的程序只能是有管理员权限的用户才能卸载。 -UninstallStatusLabel=正在从您的电脑中删除 %1,请等待。 +UninstallOnlyOnWin64=这个安装程序只能在64位Windows中进行卸载。 +OnlyAdminCanUninstall=这个安装的程序需要有管理员权限的用户才能卸载。 +UninstallStatusLabel=正在从您的电脑中删除 %1,请稍等。 UninstalledAll=%1 已顺利地从您的电脑中删除。 -UninstalledMost=%1 卸载完成。%n%n有一些内容不能被删除。您可以手工删除它们。 -UninstalledAndNeedsRestart=要完成 %1 的卸载,您的电脑必须重新启动。%n%n您现在想重新启动电脑吗? -UninstallDataCorrupted=“%1”文件被破坏,不能卸载 +UninstalledMost=%1 卸载完成。%n%n有一些内容无法被删除。您可以手动删除它们。 +UninstalledAndNeedsRestart=要完成 %1 的卸载,您的电脑必须重新启动。%n%n您想立即重新启动电脑吗? +UninstallDataCorrupted=文件“%1”已损坏,无法卸载 ; *** 卸载状态消息 ConfirmDeleteSharedFileTitle=删除共享文件吗? -ConfirmDeleteSharedFile2=系统中包含的下列共享文件已经不被其它程序使用。您想要卸载程序删除这些共享文件吗?%n%n如果这些文件被删除,但还有程序正在使用这些文件,这些程序可能不能正确执行。如果您不能确定,选择“否”。把这些文件保留在系统中以免引起问题。 -SharedFileNameLabel=文件名: -SharedFileLocationLabel=位置: +ConfirmDeleteSharedFile2=系统中包含的下列共享文件已经不再被其它程序使用。您想要卸载程序删除这些共享文件吗?%n%n如果这些文件被删除,但还有程序正在使用这些文件,这些程序可能不能正确执行。如果您不能确定,选择“否”。把这些文件保留在系统中以免引起问题。 +SharedFileNameLabel=文件名: +SharedFileLocationLabel=位置: WizardUninstalling=卸载状态 StatusUninstalling=正在卸载 %1... ; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=正在安装 %1. -ShutdownBlockReasonUninstallingApp=正在卸载 %1. +ShutdownBlockReasonInstallingApp=正在安装 %1。 +ShutdownBlockReasonUninstallingApp=正在卸载 %1。 ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. @@ -351,7 +381,7 @@ ShutdownBlockReasonUninstallingApp=正在卸载 %1. [CustomMessages] NameAndVersion=%1 版本 %2 -AdditionalIcons=附加快捷方式: +AdditionalIcons=附加快捷方式: CreateDesktopIcon=创建桌面快捷方式(&D) CreateQuickLaunchIcon=创建快速运行栏快捷方式(&Q) ProgramOnTheWeb=%1 网站 @@ -359,7 +389,6 @@ UninstallProgram=卸载 %1 LaunchProgram=运行 %1 AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A) AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联... -AutoStartProgramGroupDescription=启动组: +AutoStartProgramGroupDescription=启动组: AutoStartProgram=自动启动 %1 AddonHostProgramNotFound=%1无法找到您所选择的文件夹。%n%n您想要继续吗? - diff --git a/installer/innosetup/Languages/ChineseTraditional.isl b/installer/innosetup/Languages/ChineseTraditional.isl index 9c692956e..1663b45c8 100644 --- a/installer/innosetup/Languages/ChineseTraditional.isl +++ b/installer/innosetup/Languages/ChineseTraditional.isl @@ -1,27 +1,29 @@ -; *** Inno Setup version 6.0.0+ Chinese Traditional messages *** -; -; Name: John Wu, mr.johnwu@gmail.com -; Base on 5.5.3+ translations by Samuel Lee, Email: 751555749@qq.com +; *** Inno Setup version 6.1.0+ Chinese Traditional messages *** +; Name: Enfong Tsao, nelson22768384@gmail.com +; Based on 5.5.3+ translations by Samuel Lee, Email: 751555749@qq.com ; Translation based on network resource ; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. -; If Language Name display incorrect, uncomment next line LanguageName=<7e41><9ad4><4e2d><6587> LanguageID=$0404 LanguageCodepage=950 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. -DialogFontName=新細明體 -DialogFontSize=9 -TitleFontName=Arial -TitleFontSize=28 -WelcomeFontName=新細明體 -WelcomeFontSize=12 -CopyrightFontName=新細明體 -CopyrightFontSize=9 +;DialogFontName= +;DialogFontSize=8 +;TitleFontName=Arial +;TitleFontSize=29 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;CopyrightFontName=Arial +;CopyrightFontSize=8 [Messages] @@ -37,7 +39,7 @@ ConfirmTitle=確認 ErrorTitle=錯誤 ; *** SetupLdr messages -SetupLdrStartupMessage=這將會安裝 %1。您想要繼續嗎? +SetupLdrStartupMessage=這將會安裝 %1。您想要繼續嗎? LdrCannotCreateTemp=無法建立暫存檔案。安裝程式將會結束。 LdrCannotExecTemp=無法執行暫存檔案。安裝程式將會結束。 HelpTextNote= @@ -58,8 +60,8 @@ WinVersionTooLowError=這個程式必須在 %1 版本 %2 或以上的系統執 WinVersionTooHighError=這個程式無法安裝在 %1 版本 %2 或以上的系統。 AdminPrivilegesRequired=您必須登入成系統管理員以安裝這個程式。 PowerUserPrivilegesRequired=您必須登入成具有系統管理員或 Power User 權限的使用者以安裝這個程式。 -SetupAppRunningError=安裝程式偵測到 %1 正在執行。%n%n請關閉該程式後按 [確定] 繼續,或按 [取消] 離開。 -UninstallAppRunningError=解除安裝程式偵測到 %1 正在執行。%n%n請關閉該程式後按 [確定] 繼續,或按 [取消] 離開。 +SetupAppRunningError=安裝程式偵測到 %1 正在執行。%n%n請關閉該程式後按 「確定」 繼續,或按 「取消」 離開。 +UninstallAppRunningError=解除安裝程式偵測到 %1 正在執行。%n%n請關閉該程式後按 「確定」 繼續,或按 「取消」 離開。 ; *** Startup questions PrivilegesRequiredOverrideTitle=選擇安裝程式安裝模式 @@ -78,7 +80,7 @@ ErrorTooManyFilesInDir=無法在資料夾“%1”內建立檔案,因為資料 ; *** Setup common messages ExitSetupTitle=結束安裝程式 ExitSetupMessage=安裝尚未完成。如果您現在結束安裝程式,這個程式將不會被安裝。%n%n您可以稍後再執行安裝程式以完成安裝程序。您現在要結束安裝程式嗎? -AboutSetupMenuItem=關於安裝程式(&A)... +AboutSetupMenuItem=關於安裝程式 (&A)... AboutSetupTitle=關於安裝程式 AboutSetupMessage=%1 版本 %2%n%3%n%n%1 網址:%n%4 AboutSetupNote= @@ -91,23 +93,23 @@ ButtonNext=下一步(&N) > ButtonOK=確定 ButtonCancel=取消 ButtonYes=是(&Y) -ButtonYesToAll=全部皆是(&A) +ButtonYesToAll=全部皆是 (&A) ButtonNo=否(&N) -ButtonNoToAll=全部皆否(&O) -ButtonFinish=完成(&F) -ButtonBrowse=瀏覽(&B)... -ButtonWizardBrowse=瀏覽(&R)... -ButtonNewFolder=建立新資料夾(&M) +ButtonNoToAll=全部皆否 (&O) +ButtonFinish=完成 (&F) +ButtonBrowse=瀏覽 (&B)... +ButtonWizardBrowse=瀏覽 (&R)... +ButtonNewFolder=建立新資料夾 (&M) ; *** "Select Language" dialog messages SelectLanguageTitle=選擇安裝語言 SelectLanguageLabel=選擇在安裝過程中使用的語言: ; *** Common wizard text -ClickNext=按 [下一步] 繼續安裝,或按 [取消] 結束安裝程式。 +ClickNext=按 「下一步」 繼續安裝,或按 「取消」 結束安裝程式。 BeveledLabel= BrowseDialogTitle=瀏覽資料夾 -BrowseDialogLabel=在下面的資料夾列表中選擇一個資料夾,然後按 [確定]。 +BrowseDialogLabel=在下面的資料夾列表中選擇一個資料夾,然後按 「確定」。 NewFolderName=新資料夾 ; *** "Welcome" wizard page @@ -117,24 +119,24 @@ WelcomeLabel2=這個安裝程式將會安裝 [name/ver] 到您的電腦。%n%n ; *** "Password" wizard page WizardPassword=密碼 PasswordLabel1=這個安裝程式具有密碼保護。 -PasswordLabel3=請輸入密碼,然後按 [下一步] 繼續。密碼是區分大小寫的。 -PasswordEditLabel=密碼(&P): +PasswordLabel3=請輸入密碼,然後按 「下一步」 繼續。密碼是區分大小寫的。 +PasswordEditLabel=密碼 (&P): IncorrectPassword=您輸入的密碼不正確,請重新輸入。 ; *** "License Agreement" wizard page WizardLicense=授權合約 LicenseLabel=請閱讀以下授權合約。 LicenseLabel3=請閱讀以下授權合約,您必須接受合約的各項條款才能繼續安裝。 -LicenseAccepted=我同意(&A) -LicenseNotAccepted=我不同意(&D) +LicenseAccepted=我同意 (&A) +LicenseNotAccepted=我不同意 (&D) ; *** "Information" wizard pages WizardInfoBefore=訊息 InfoBeforeLabel=在繼續安裝之前請閱讀以下重要資訊。 -InfoBeforeClickLabel=當您準備好繼續安裝,請按 [下一步]。 +InfoBeforeClickLabel=當您準備好繼續安裝,請按 「下一步」。 WizardInfoAfter=訊息 InfoAfterLabel=在繼續安裝之前請閱讀以下重要資訊。 -InfoAfterClickLabel=當您準備好繼續安裝,請按 [下一步]。 +InfoAfterClickLabel=當您準備好繼續安裝,請按 「下一步」。 ; *** "User Information" wizard page WizardUserInfo=使用者資訊 @@ -148,14 +150,15 @@ UserInfoNameRequired=您必須輸入您的名稱。 WizardSelectDir=選擇目的資料夾 SelectDirDesc=選擇安裝程式安裝 [name] 的位置。 SelectDirLabel3=安裝程式將會把 [name] 安裝到下面的資料夾。 -SelectDirBrowseLabel=按 [下一步] 繼續,如果您想選擇另一個資料夾,請按 [瀏覽]。 +SelectDirBrowseLabel=按 「下一步」 繼續,如果您想選擇另一個資料夾,請按 「瀏覽」。 +DiskSpaceGBLabel=最少需要 [gb] GB 磁碟空間。 DiskSpaceMBLabel=最少需要 [mb] MB 磁碟空間。 CannotInstallToNetworkDrive=安裝程式無法安裝於網絡磁碟機。 CannotInstallToUNCPath=安裝程式無法安裝於 UNC 路徑。 InvalidPath=您必須輸入完整的路徑名稱及磁碟機代碼。%n%n例如 C:\App 或 UNC 路徑格式 \\伺服器\共用資料夾。 InvalidDrive=您選取的磁碟機或 UNC 名稱不存在或無法存取,請選擇其他的目的地。 DiskSpaceWarningTitle=磁碟空間不足 -DiskSpaceWarning=安裝程式需要至少 %1 KB 的磁碟空間,您所選取的磁碟只有 %2 KB 可用空間。%n%n您要繼續安裝嗎? +DiskSpaceWarning=安裝程式需要至少 %1 KB 的磁碟空間,您所選取的磁碟只有 %2 KB 可用空間。%n%n您要繼續安裝嗎? DirNameTooLong=資料夾名稱或路徑太長。 InvalidDirName=資料夾名稱不正確。 BadDirName32=資料夾名稱不得包含以下特殊字元:%n%n%1 @@ -167,38 +170,39 @@ DirDoesntExist=資料夾:%n%n%1%n%n 不存在。要建立該資料夾嗎? ; *** "Select Components" wizard page WizardSelectComponents=選擇元件 SelectComponentsDesc=選擇將會被安裝的元件。 -SelectComponentsLabel2=選擇您想要安裝的元件;清除您不想安裝的元件。然後按 [下一步] 繼續安裝。 +SelectComponentsLabel2=選擇您想要安裝的元件;清除您不想安裝的元件。然後按 「下一步」 繼續安裝。 FullInstallation=完整安裝 ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=最小安裝 CustomInstallation=自訂安裝 NoUninstallWarningTitle=元件已存在 -NoUninstallWarning=安裝程式偵測到以下元件已經安裝在您的電腦上:%n%n%1%n%n取消選擇這些元件將不會移除它們。%n%n您仍然要繼續嗎? +NoUninstallWarning=安裝程式偵測到以下元件已經安裝在您的電腦上:%n%n%1%n%n取消選擇這些元件將不會移除它們。%n%n您仍然要繼續嗎? ComponentSize1=%1 KB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=目前的選擇需要至少 [gb] GB 磁碟空間。 ComponentsDiskSpaceMBLabel=目前的選擇需要至少 [mb] MB 磁碟空間。 ; *** "Select Additional Tasks" wizard page WizardSelectTasks=選擇附加的工作 SelectTasksDesc=選擇要執行的附加工作。 -SelectTasksLabel2=選擇安裝程式在安裝 [name] 時要執行的附加工作,然後按 [下一步]。 +SelectTasksLabel2=選擇安裝程式在安裝 [name] 時要執行的附加工作,然後按 「下一步」。 ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=選擇「開始」功能表的資料夾 SelectStartMenuFolderDesc=選擇安裝程式建立程式的捷徑的位置。 SelectStartMenuFolderLabel3=安裝程式將會把程式的捷徑建立在下面的「開始」功能表資料夾。 -SelectStartMenuFolderBrowseLabel=按 [下一步] 繼續,如果您想選擇另一個資料夾,請按 [瀏覽]。 +SelectStartMenuFolderBrowseLabel=按 「下一步」 繼續,如果您想選擇另一個資料夾,請按 「瀏覽」。 MustEnterGroupName=您必須輸入一個資料夾的名稱。 GroupNameTooLong=資料夾名稱或路徑太長。 InvalidGroupName=資料夾名稱不正確。 BadGroupName=資料夾名稱不得包含下列字元:%n%n%1 -NoProgramGroupCheck2=不要在「開始」功能表中建立資料夾(&D) +NoProgramGroupCheck2=不要在「開始」功能表中建立資料夾 (&D) ; *** "Ready to Install" wizard page WizardReady=準備安裝 ReadyLabel1=安裝程式將開始安裝 [name] 到您的電腦中。 -ReadyLabel2a=按下 [安裝] 繼續安裝,或按 [上一步] 重新檢視或設定各選項的內容。 -ReadyLabel2b=按下 [安裝] 繼續安裝。 +ReadyLabel2a=按下 「安裝」 繼續安裝,或按 「上一步」 重新檢視或設定各選項的內容。 +ReadyLabel2b=按下 「安裝」 繼續安裝。 ReadyMemoUserInfo=使用者資訊 ReadyMemoDir=目的資料夾: ReadyMemoType=安裝型態: @@ -206,16 +210,29 @@ ReadyMemoComponents=選擇的元件: ReadyMemoGroup=「開始」功能表資料夾: ReadyMemoTasks=附加工作: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=正在下載額外檔案... +ButtonStopDownload=停止下載 (&S) +StopDownload=您確定要停止下載嗎? +ErrorDownloadAborted=已停止下載 +ErrorDownloadFailed=下載失敗: %1 %2 +ErrorDownloadSizeFailed=取得檔案大小失敗: %1 %2 +ErrorFileHash1=檔案雜湊失敗: %1 +ErrorFileHash2=檔案雜湊無效: 必須為 %1,收到 %2 +ErrorProgress=進度無效: %1 之 %2 +ErrorFileSize=檔案大小無效: 必須為 %1,收到 %2 + ; *** "Preparing to Install" wizard page WizardPreparing=準備安裝程式 PreparingDesc=安裝程式準備將 [name] 安裝到您的電腦上。 PreviousInstallNotCompleted=先前的安裝/ 解除安裝尚未完成,您必須重新啟動電腦以完成該安裝。%n%n在重新啟動電腦之後,請再執行這個程式來安裝 [name]。 -CannotContinue=安裝程式無法繼續。請按 [取消] 離開。 -ApplicationsFound=下面的應用程式正在使用安裝程式所需要更新的文檔。建議您允許安裝程式自動關閉這些應用程式。 -ApplicationsFound2=下面的應用程式正在使用安裝程式所需要更新的文檔。建議您允許安裝程式自動關閉這些應用程式。當安裝過程結束後,本安裝程式將會嘗試重新開啟該應用程式。 -CloseApplications=關閉應用程式(&A) +CannotContinue=安裝程式無法繼續。請按 「取消」 離開。 +ApplicationsFound=下面的應用程式正在使用安裝程式所需要更新的檔案。建議您允許安裝程式自動關閉這些應用程式。 +ApplicationsFound2=下面的應用程式正在使用安裝程式所需要更新的檔案。建議您允許安裝程式自動關閉這些應用程式。當安裝過程結束後,本安裝程式將會嘗試重新開啟該應用程式。 +CloseApplications=關閉應用程式 (&A) DontCloseApplications=不要關閉應用程式 (&D) ErrorCloseApplications=安裝程式無法自動關閉所有應用程式。建議您在繼續前先關閉所有應用程式使用的檔案。 +PrepareToInstallNeedsRestart=安裝程式必須重新啟動您的電腦。重新啟動後,請再次執行安裝程式以完成 [name] 的安裝。%n%n您想要現在重新啟動電腦嗎? ; *** "Installing" wizard page WizardInstalling=正在安裝 @@ -225,9 +242,9 @@ InstallingLabel=請稍候,安裝程式正在將 [name] 安裝到您的電腦 FinishedHeadingLabel=安裝完成 FinishedLabelNoIcons=安裝程式已經將 [name] 安裝在您的電腦上。 FinishedLabel=安裝程式已經將 [name] 安裝在您的電腦中,您可以選擇程式的圖示來執行該應用程式。 -ClickFinish=按 [完成] 以結束安裝程式。 -FinishedRestartLabel=要完成 [name] 的安裝,安裝程式必須重新啟動您的電腦。您想要現在重新啟動電腦嗎? -FinishedRestartMessage=要完成 [name] 的安裝,安裝程式必須重新啟動您的電腦。%n%n您想要現在重新啟動電腦嗎? +ClickFinish=按 「完成」 以結束安裝程式。 +FinishedRestartLabel=要完成 [name] 的安裝,安裝程式必須重新啟動您的電腦。您想要現在重新啟動電腦嗎? +FinishedRestartMessage=要完成 [name] 的安裝,安裝程式必須重新啟動您的電腦。%n%n您想要現在重新啟動電腦嗎? ShowReadmeCheck=是,我要閱讀讀我檔案。 YesRadio=是,立即重新啟動電腦(&Y) NoRadio=否,我稍後重新啟動電腦(&N) @@ -238,7 +255,7 @@ RunEntryShellExec=檢視 %1 ; *** "Setup Needs the Next Disk" ChangeDiskTitle=安裝程式需要下一張磁片 -SelectDiskLabel2=請插入磁片 %1,然後按 [確定]。%n%n如果檔案不在以下所顯示的資料夾之中,請輸入正確的資料夾名稱或按 [瀏覽] 選取。 +SelectDiskLabel2=請插入磁片 %1,然後按 「確定」。%n%n如果檔案不在以下所顯示的資料夾之中,請輸入正確的資料夾名稱或按 [瀏覽] 選取。 PathLabel=路徑(&P): FileNotInDir2=檔案“%1”無法在“%2”找到。請插入正確的磁片或選擇其它的資料夾。 SelectDirectoryLabel=請指定下一張磁片的位置。 @@ -287,12 +304,20 @@ ExistingFileReadOnly2=無法取代現有檔案,因為檔案已標示為唯讀 ExistingFileReadOnlyRetry=移除唯讀屬性並重試 (&R) ExistingFileReadOnlyKeepExisting=保留現有檔案 (&K) ErrorReadingExistingDest=讀取一個已存在的檔案時發生錯誤: -FileExists=檔案已經存在。%n%n 要讓安裝程式加以覆寫嗎? -ExistingFileNewer=存在的檔案版本比較新,建議您保留目前已存在的檔案。%n%n您要保留目前已存在的檔案嗎? +FileExistsSelectAction=選擇操作 +FileExists2=檔案已存在。 +FileExistsOverwriteExisting=覆寫現有檔案 +FileExistsKeepExisting=保留現有檔案 (&O) +FileExistsOverwriteOrKeepAll=對下次衝突執行相同操作 (&D) +ExistingFileNewerSelectAction=選擇操作 +ExistingFileNewer2=現有檔案比安裝程式嘗試安裝的檔案還新。 +ExistingFileNewerOverwriteExisting=覆寫現有檔案 (&O) +ExistingFileNewerKeepExisting=保留現有檔案 (&K) (建議選項) +ExistingFileNewerOverwriteOrKeepAll=對下次衝突執行相同操作 (&D) ErrorChangingAttr=在變更檔案屬性時發生錯誤: ErrorCreatingTemp=在目的資料夾中建立檔案時發生錯誤: ErrorReadingSource=讀取原始檔案時發生錯誤: -ErrorCopying=復制檔案時發生錯誤: +ErrorCopying=複製檔案時發生錯誤: ErrorReplacingExistingFile=取代檔案時發生錯誤: ErrorRestartReplace=重新啟動電腦後取代檔案失敗: ErrorRenamingTemp=在目的資料夾變更檔案名稱時發生錯誤: @@ -305,28 +330,28 @@ ErrorRegisterTypeLib=無法注冊類型庫: %1。 UninstallDisplayNameMark=%1 (%2) ; used for example as 'My Program (32-bit, All users)' UninstallDisplayNameMarks=%1 (%2, %3) -UninstallDisplayNameMark32Bit=32-bit -UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMark32Bit=32 位元 +UninstallDisplayNameMark64Bit=64 位元 UninstallDisplayNameMarkAllUsers=所有使用者 UninstallDisplayNameMarkCurrentUser=目前使用者 ; *** Post-installation errors ErrorOpeningReadme=開啟讀我檔案時發生錯誤。 -ErrorRestartingComputer=安裝程式無法重新啟動電腦,請以手動方式自行重新啟動電腦。 +ErrorRestartingComputer=安裝程式無法重新啟動電腦,請自行重新啟動。 ; *** Uninstaller messages -UninstallNotFound=檔案“%1”不存在,無法移除程式。 -UninstallOpenError=無法開啟檔案“%1”,無法移除程式。 +UninstallNotFound=檔案“%1”不存在,無法解除安裝。 +UninstallOpenError=無法開啟檔案“%1”,無法解除安裝 UninstallUnsupportedVer=這個版本的解除安裝程式無法辨識記錄檔 “%1” 之格式,無法解除安裝。 UninstallUnknownEntry=解除安裝記錄檔中發現未知的記錄 (%1)。 -ConfirmUninstall=您確定要完全移除 %1 及其相關的檔案嗎? +ConfirmUninstall=您確定要完全移除 %1 及其相關的檔案嗎? UninstallOnlyOnWin64=這個程式只能在 64 位元的 Windows 上解除安裝。 OnlyAdminCanUninstall=這個程式要具備系統管理員權限的使用者方可解除安裝。 UninstallStatusLabel=正在從您的電腦移除 %1 中,請稍候... UninstalledAll=%1 已經成功從您的電腦中移除。 UninstalledMost=%1 解除安裝完成。%n%n某些檔案及元件無法移除,您可以自行刪除這些檔案。 -UninstalledAndNeedsRestart=要完成 %1 的解除安裝程序,您必須重新啟動電腦。%n%n您想要現在重新啟動電腦嗎? -UninstallDataCorrupted=檔案“%1”已經損毀,無法解除安裝。 +UninstalledAndNeedsRestart=要完成 %1 的解除安裝程序,您必須重新啟動電腦。%n%n您想要現在重新啟動電腦嗎? +UninstallDataCorrupted=檔案“%1”已經損毀,無法解除安裝 ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=移除共用檔案 @@ -337,8 +362,8 @@ WizardUninstalling=解除安裝狀態 StatusUninstalling=正在解除安裝 %1... ; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=正在安裝 %1. -ShutdownBlockReasonUninstallingApp=正在解除安裝 %1. +ShutdownBlockReasonInstallingApp=正在安裝 %1。 +ShutdownBlockReasonUninstallingApp=正在解除安裝 %1。 ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. @@ -356,4 +381,4 @@ AssocFileExtension=將 %1 與檔案副檔名 %2 產生關聯(&A) AssocingFileExtension=正在將 %1 與檔案副檔名 %2 產生關聯... AutoStartProgramGroupDescription=開啟: AutoStartProgram=自動開啟 %1 -AddonHostProgramNotFound=%1 無法在您所選的資料夾中找到。%n%n您是否還要繼續? +AddonHostProgramNotFound=%1 無法在您所選的資料夾中找到。%n%n您是否還要繼續? \ No newline at end of file diff --git a/installer/innosetup/Languages/Corsican.isl b/installer/innosetup/Languages/Corsican.isl new file mode 100644 index 000000000..6f03bcaf3 --- /dev/null +++ b/installer/innosetup/Languages/Corsican.isl @@ -0,0 +1,399 @@ +; *** Inno Setup version 6.1.0+ Corsican messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +; Created and maintained by Patriccollu di Santa Maria è Sichè +; Schedariu di traduzzione in lingua corsa da Patriccollu +; E-mail: Patrick.Santa-Maria[at]LaPoste.Net +; +; Changes: +; November 14th, 2020 - Changes to current version 6.1.0+ +; July 25th, 2020 - Update to version 6.1.0+ +; July 1st, 2020 - Update to version 6.0.6+ +; October 6th, 2019 - Update to version 6.0.3+ +; January 20th, 2019 - Update to version 6.0.0+ +; April 9th, 2016 - Changes to current version 5.5.3+ +; January 3rd, 2013 - Update to version 5.5.3+ +; August 8th, 2012 - Update to version 5.5.0+ +; September 17th, 2011 - Creation for version 5.1.11 + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Corsu +LanguageID=$0483 +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Assistente d’installazione +SetupWindowTitle=Assistente d’installazione - %1 +UninstallAppTitle=Disinstallà +UninstallAppFullTitle=Disinstallazione di %1 + +; *** Misc. common +InformationTitle=Infurmazione +ConfirmTitle=Cunfirmà +ErrorTitle=Sbagliu + +; *** SetupLdr messages +SetupLdrStartupMessage=St’assistente hà da installà %1. Vulete cuntinuà ? +LdrCannotCreateTemp=Impussibule di creà un cartulare timpurariu. Assistente d’installazione interrottu +LdrCannotExecTemp=Impussibule d’eseguisce u schedariu in u cartulare timpurariu. Assistente d’installazione interrottu +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nSbagliu %2 : %3 +SetupFileMissing=U schedariu %1 manca in u cartulare d’installazione. Ci vole à currege u penseru o ottene una nova copia di u prugramma. +SetupFileCorrupt=I schedarii d’installazione sò alterati. Ci vole à ottene una nova copia di u prugramma. +SetupFileCorruptOrWrongVer=I schedarii d’installazione sò alterati, o sò incumpatibule cù sta versione di l’assistente. Ci vole à currege u penseru o ottene una nova copia di u prugramma. +InvalidParameter=Un parametru micca accettevule hè statu passatu in a linea di cumanda :%n%n%1 +SetupAlreadyRunning=L’assistente d’installazione hè dighjà in corsu. +WindowsVersionNotSupported=Stu prugramma ùn pò micca funziunà cù a versione di Windows installata nant’à st’urdinatore. +WindowsServicePackRequired=Stu prugramma richiede %1 Service Pack %2 o più recente. +NotOnThisPlatform=Stu prugramma ùn funzionerà micca cù %1. +OnlyOnThisPlatform=Stu prugramma deve funzionà cù %1. +OnlyOnTheseArchitectures=Stu prugramma pò solu esse installatu nant’à e versioni di Windows fatte apposta per st’architetture di prucessore :%n%n%1 +WinVersionTooLowError=Stu prugramma richiede %1 versione %2 o più recente. +WinVersionTooHighError=Stu prugramma ùn pò micca esse installatu nant’à %1 version %2 o più recente. +AdminPrivilegesRequired=Ci vole à esse cunnettu cum’è un amministratore quandu voi installate stu prugramma. +PowerUserPrivilegesRequired=Ci vole à esse cunnettu cum’è un amministratore o fà parte di u gruppu « Utilizatori cù putere » quandu voi installate stu prugramma. +SetupAppRunningError=L’assistente hà vistu chì %1 era dighjà in corsu.%n%nCi vole à chjode tutte e so finestre avà, eppò sceglie Vai per cuntinuà, o Abbandunà per compie. +UninstallAppRunningError=A disinstallazione hà vistu chì %1 era dighjà in corsu.%n%nCi vole à chjode tutte e so finestre avà, eppò sceglie Vai per cuntinuà, o Abbandunà per compie. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Selezziunà u modu d’installazione di l’assistente +PrivilegesRequiredOverrideInstruction=Selezziunà u modu d’installazione +PrivilegesRequiredOverrideText1=%1 pò esse installatu per tutti l’utilizatore (richiede i diritti d’amministratore), o solu per voi. +PrivilegesRequiredOverrideText2=%1 pò esse installatu solu per voi, o per tutti l’utilizatore (richiede i diritti d’amministratore). +PrivilegesRequiredOverrideAllUsers=Installazione per &tutti l’utilizatori +PrivilegesRequiredOverrideAllUsersRecommended=Installazione per &tutti l’utilizatori (ricumandatu) +PrivilegesRequiredOverrideCurrentUser=Installazione solu per &mè +PrivilegesRequiredOverrideCurrentUserRecommended=Installazione solu per &mè (ricumandatu) + +; *** Misc. errors +ErrorCreatingDir=L’assistente ùn hà micca pussutu creà u cartulare « %1 » +ErrorTooManyFilesInDir=Impussibule di creà un schedariu in u cartulare « %1 » perchè ellu ne cuntene troppu + +; *** Setup common messages +ExitSetupTitle=Compie l’assistente +ExitSetupMessage=L’assistente ùn hè micca compiu bè. S’è voi escite avà, u prugramma ùn serà micca installatu.%n%nPudete impiegà l’assistente torna un altra volta per compie l’installazione.%n%nCompie l’assistente ? +AboutSetupMenuItem=&Apprupositu di l’assistente… +AboutSetupTitle=Apprupositu di l’assistente +AboutSetupMessage=%1 versione %2%n%3%n%n%1 pagina d’accolta :%n%4 +AboutSetupNote= +TranslatorNote=Traduzzione in lingua corsa da Patriccollu di Santa Maria è Sichè + +; *** Buttons +ButtonBack=< &Precedente +ButtonNext=&Seguente > +ButtonInstall=&Installà +ButtonOK=Vai +ButtonCancel=Abbandunà +ButtonYes=&Iè +ButtonYesToAll=Iè per &tutti +ButtonNo=I&nnò +ButtonNoToAll=Innò per t&utti +ButtonFinish=&Piantà +ButtonBrowse=&Sfuglià… +ButtonWizardBrowse=&Sfuglià… +ButtonNewFolder=&Creà un novu cartulare + +; *** "Select Language" dialog messages +SelectLanguageTitle=Definisce a lingua di l’assistente +SelectLanguageLabel=Selezziunà a lingua à impiegà per l’installazione. + +; *** Common wizard text +ClickNext=Sceglie Seguente per cuntinuà, o Abbandunà per compie l’assistente. +BeveledLabel= +BrowseDialogTitle=Sfuglià u cartulare +BrowseDialogLabel=Selezziunà un cartulare in a lista inghjò, eppò sceglie Vai. +NewFolderName=Novu cartulare + +; *** "Welcome" wizard page +WelcomeLabel1=Benvenuta in l’assistente d’installazione di [name] +WelcomeLabel2=Quessu installerà [name/ver] nant’à l’urdinatore.%n%nHè ricumandatu di chjode tutte l’altre appiecazioni nanzu di cuntinuà. + +; *** "Password" wizard page +WizardPassword=Parolla d’entrata +PasswordLabel1=L’installazione hè prutetta da una parolla d’entrata. +PasswordLabel3=Ci vole à pruvede a parolla d’entrata, eppò sceglie Seguente per cuntinuà. E parolle d’entrata ponu cuntene maiuscule è minuscule. +PasswordEditLabel=&Parolla d’entrata : +IncorrectPassword=A parolla d’entrata pruvista ùn hè micca curretta. Ci vole à pruvà torna. + +; *** "License Agreement" wizard page +WizardLicense=Cuntrattu di licenza +LicenseLabel=Ci vole à leghje l’infurmazione impurtante chì seguiteghja nanzu di cuntinuà. +LicenseLabel3=Ci vole à leghje u cuntrattu di licenza chì seguiteghja. Duvete accettà i termini di stu cuntrattu nanzu di cuntinuà l’installazione. +LicenseAccepted=Sò d’&accunsentu cù u cuntrattu +LicenseNotAccepted=Ùn sò &micca d’accunsentu cù u cuntrattu + +; *** "Information" wizard pages +WizardInfoBefore=Infurmazione +InfoBeforeLabel=Ci vole à leghje l’infurmazione impurtante chì seguiteghja nanzu di cuntinuà. +InfoBeforeClickLabel=Quandu site prontu à cuntinuà cù l’assistente, sciglite Seguente. +WizardInfoAfter=Infurmazione +InfoAfterLabel=Ci vole à leghje l’infurmazione impurtante chì seguiteghja nanzu di cuntinuà. +InfoAfterClickLabel=Quandu site prontu à cuntinuà cù l’assistente, sciglite Seguente. + +; *** "User Information" wizard page +WizardUserInfo=Infurmazioni di l’utilizatore +UserInfoDesc=Ci vole à scrive e vostre infurmazioni. +UserInfoName=&Nome d’utilizatore : +UserInfoOrg=&Urganismu : +UserInfoSerial=&Numeru di Seria : +UserInfoNameRequired=Ci vole à scrive un nome. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Selezziunà u locu di destinazione +SelectDirDesc=Induve [name] deve esse installatu ? +SelectDirLabel3=L’assistente installerà [name] in stu cartulare. +SelectDirBrowseLabel=Per cuntinuà, sceglie Seguente. S’è voi preferisce selezziunà un altru cartulare, sciglite Sfuglià. +DiskSpaceGBLabel=Hè richiestu omancu [gb] Go di spaziu liberu di discu. +DiskSpaceMBLabel=Hè richiestu omancu [mb] Mo di spaziu liberu di discu. +CannotInstallToNetworkDrive=L’assistente ùn pò micca installà nant’à un discu di a reta. +CannotInstallToUNCPath=L’assistente ùn pò micca installà in un chjassu UNC. +InvalidPath=Ci vole à scrive un chjassu cumplettu cù a lettera di u lettore ; per indettu :%n%nC:\APP%n%no un chjassu UNC in a forma :%n%n\\servitore\spartu +InvalidDrive=U lettore o u chjassu UNC spartu ùn esiste micca o ùn hè micca accessibule. Ci vole à selezziunane un altru. +DiskSpaceWarningTitle=Ùn basta u spaziu discu +DiskSpaceWarning=L’assistente richiede omancu %1 Ko di spaziu liberu per installà, ma u lettore selezziunatu hà solu %2 Ko dispunibule.%n%nVulete cuntinuà quantunque ? +DirNameTooLong=U nome di cartulare o u chjassu hè troppu longu. +InvalidDirName=U nome di cartulare ùn hè micca accettevule. +BadDirName32=I nomi di cartulare ùn ponu micca cuntene sti caratteri :%n%n%1 +DirExistsTitle=Cartulare esistente +DirExists=U cartulare :%n%n%1%n%nesiste dighjà. Vulete installà in stu cartulare quantunque ? +DirDoesntExistTitle=Cartulare inesistente +DirDoesntExist=U cartulare :%n%n%1%n%nùn esiste micca. Vulete chì stu cartulare sia creatu ? + +; *** "Select Components" wizard page +WizardSelectComponents=Selezzione di cumpunenti +SelectComponentsDesc=Chì cumpunenti devenu esse installati ? +SelectComponentsLabel2=Selezziunà i cumpunenti à installà ; deselezziunà quelli ch’ùn devenu micca esse installati. Sceglie Seguente quandu site prontu à cuntinuà. +FullInstallation=Installazione sana +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Installazione cumpatta +CustomInstallation=Installazione persunalizata +NoUninstallWarningTitle=Cumpunenti esistenti +NoUninstallWarning=L’assistente hà vistu chì sti cumpunenti sò dighjà installati nant’à l’urdinatore :%n%n%1%n%nDeselezziunà sti cumpunenti ùn i disinstallerà micca.%n%nVulete cuntinuà quantunque ? +ComponentSize1=%1 Ko +ComponentSize2=%1 Mo +ComponentsDiskSpaceGBLabel=A selezzione attuale richiede omancu [gb] Go di spaziu liberu nant’à u discu. +ComponentsDiskSpaceMBLabel=A selezzione attuale richiede omancu [mb] Mo di spaziu liberu nant’à u discu. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Selezziunà trattamenti addizziunali +SelectTasksDesc=Chì trattamenti addizziunali vulete fà ? +SelectTasksLabel2=Selezziunà i trattamenti addizziunali chì l’assistente deve fà durante l’installazione di [name], eppò sceglie Seguente. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Selezzione di u cartulare di u listinu « Démarrer » +SelectStartMenuFolderDesc=Induve l’assistente deve piazzà l’accurtatoghji di u prugramma ? +SelectStartMenuFolderLabel3=L’assistente piazzerà l’accurtatoghji di u prugramma in stu cartulare di u listinu « Démarrer ». +SelectStartMenuFolderBrowseLabel=Per cuntinuà, sceglie Seguente. S’è voi preferisce selezziunà un altru cartulare, sciglite Sfuglià. +MustEnterGroupName=Ci vole à scrive un nome di cartulare. +GroupNameTooLong=U nome di cartulare o u chjassu hè troppu longu. +InvalidGroupName=U nome di cartulare ùn hè micca accettevule. +BadGroupName=U nome di u cartulare ùn pò micca cuntene alcunu di sti caratteri :%n%n%1 +NoProgramGroupCheck2=Ùn creà &micca di cartulare in u listinu « Démarrer » + +; *** "Ready to Install" wizard page +WizardReady=Prontu à Installà +ReadyLabel1=Avà l’assistente hè prontu à principià l’installazione di [name] nant’à l’urdinatore. +ReadyLabel2a=Sceglie Installà per cuntinuà l’installazione, o nant’à Precedente per rivede o cambià qualchì preferenza. +ReadyLabel2b=Sceglie Installà per cuntinuà l’installazione. +ReadyMemoUserInfo=Infurmazioni di l’utilizatore : +ReadyMemoDir=Cartulare d’installazione : +ReadyMemoType=Tipu d’installazione : +ReadyMemoComponents=Cumpunenti selezziunati : +ReadyMemoGroup=Cartulare di u listinu « Démarrer » : +ReadyMemoTasks=Trattamenti addizziunali : + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Scaricamentu di i schedarii addiziunali… +ButtonStopDownload=&Piantà u scaricamentu +StopDownload=Site sicuru di vulè piantà u scaricamentu ? +ErrorDownloadAborted=Scaricamentu interrottu +ErrorDownloadFailed=Scaricamentu fiascu : %1 %2 +ErrorDownloadSizeFailed=Fiascu per ottene a dimensione : %1 %2 +ErrorFileHash1=Fiascu di u tazzeghju di u schedariu : %1 +ErrorFileHash2=Tazzeghju di u schedariu inaccettevule : aspettatu %1, trovu %2 +ErrorProgress=Prugressione inaccettevule : %1 di %2 +ErrorFileSize=Dimensione di u schedariu inaccettevule : aspettatu %1, trovu %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparazione di l’installazione +PreparingDesc=L’assistente appronta l’installazione di [name] nant’à l’urdinatore. +PreviousInstallNotCompleted=L’installazione o a cacciatura di un prugramma precedente ùn s’hè micca compia bè. Ci vulerà à ridimarrà l’urdinatore per compie st’installazione.%n%nDopu, ci vulerà à rilancià l’assistente per compie l’installazione di [name]. +CannotContinue=L’assistente ùn pò micca cuntinuà. Sceglie Abbandunà per esce. +ApplicationsFound=St’appiecazioni impieganu schedarii chì devenu esse mudificati da l’assistente. Hè ricumandatu di permette à l’assistente di chjode autumaticamente st’appiecazioni. +ApplicationsFound2=St’appiecazioni impieganu schedarii chì devenu esse mudificati da l’assistente. Hè ricumandatu di permette à l’assistente di chjode autumaticamente st’appiecazioni. S’è l’installazione si compie bè, l’assistente pruverà di rilancià l’appiecazioni. +CloseApplications=Chjode &autumaticamente l’appiecazioni +DontCloseApplications=Ùn chjode &micca l’appiecazioni +ErrorCloseApplications=L’assistente ùn hà micca pussutu chjode autumaticamente tutti l’appiecazioni. Nanzu di cuntinuà, hè ricumandatu di chjode tutti l’appiecazioni chì impieganu schedarii chì devenu esse mudificati da l’assistente durante l’installazione. +PrepareToInstallNeedsRestart=L’assistente deve ridimarrà l’urdinatore. Dopu, ci vulerà à rilancià l’assistente per compie l’installazione di [name].%n%nVulete ridimarrà l’urdinatore subitu ? + +; *** "Installing" wizard page +WizardInstalling=Installazione in corsu +InstallingLabel=Ci vole à aspettà durante l’installazione di [name] nant’à l’urdinatore. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Fine di l’installazione di [name] +FinishedLabelNoIcons=L’assistente hà compiu l’installazione di [name] nant’à l’urdinatore. +FinishedLabel=L’assistente hà compiu l’installazione di [name] nant’à l’urdinatore. L’appiecazione pò esse lanciata selezziunendu l’accurtatoghji installati. +ClickFinish=Sceglie Piantà per compie l’assistente. +FinishedRestartLabel=Per compie l’installazione di [name], l’assistente deve ridimarrà l’urdinatore. Vulete ridimarrà l’urdinatore subitu ? +FinishedRestartMessage=Per compie l’installazione di [name], l’assistente deve ridimarrà l’urdinatore.%n%nVulete ridimarrà l’urdinatore subitu ? +ShowReadmeCheck=Iè, vogliu leghje u schedariu LISEZMOI o README +YesRadio=&Iè, ridimarrà l’urdinatore subitu +NoRadio=I&nnò, preferiscu ridimarrà l’urdinatore dopu +; used for example as 'Run MyProg.exe' +RunEntryExec=Eseguisce %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Fighjà %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=L’assistente hà bisogniu di u discu seguente +SelectDiskLabel2=Mette u discu %1 è sceglie Vai.%n%nS’è i schedarii di stu discu si trovanu in un’altru cartulare chì quellu indicatu inghjò, scrive u chjassu currettu o sceglie Sfuglià. +PathLabel=&Chjassu : +FileNotInDir2=U schedariu « %1 » ùn si truva micca in « %2 ». Mette u discu curretu o sceglie un’altru cartulare. +SelectDirectoryLabel=Ci vole à specificà induve si trova u discu seguente. + +; *** Installation phase messages +SetupAborted=L’installazione ùn s’hè micca compia bè.%n%nCi vole à currege u penseru è eseguisce l’assistente torna. +AbortRetryIgnoreSelectAction=Selezziunate un’azzione +AbortRetryIgnoreRetry=&Pruvà torna +AbortRetryIgnoreIgnore=&Ignurà u sbagliu è cuntinuà +AbortRetryIgnoreCancel=Abbandunà l’installazione + +; *** Installation status messages +StatusClosingApplications=Chjusura di l’appiecazioni… +StatusCreateDirs=Creazione di i cartulari… +StatusExtractFiles=Estrazzione di i schedarii… +StatusCreateIcons=Creazione di l’accurtatoghji… +StatusCreateIniEntries=Creazione di l’elementi INI… +StatusCreateRegistryEntries=Creazione di l’elementi di u registru… +StatusRegisterFiles=Arregistramentu di i schedarii… +StatusSavingUninstall=Cunservazione di l’informazioni di disinstallazione… +StatusRunProgram=Cumpiera di l’installazione… +StatusRestartingApplications=Relanciu di l’appiecazioni… +StatusRollback=Annulazione di i mudificazioni… + +; *** Misc. errors +ErrorInternal2=Sbagliu internu : %1 +ErrorFunctionFailedNoCode=Fiascu di %1 +ErrorFunctionFailed=Fiascu di %1 ; codice %2 +ErrorFunctionFailedWithMessage=Fiascu di %1 ; codice %2.%n%3 +ErrorExecutingProgram=Impussibule d’eseguisce u schedariu :%n%1 + +; *** Registry errors +ErrorRegOpenKey=Sbagliu durante l’apertura di a chjave di registru :%n%1\%2 +ErrorRegCreateKey=Sbagliu durante a creazione di a chjave di registru :%n%1\%2 +ErrorRegWriteKey=Sbagliu durante a scrittura di a chjave di registru :%n%1\%2 + +; *** INI errors +ErrorIniEntry=Sbagliu durante a creazione di l’elementu INI in u schedariu « %1 ». + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=Ignurà stu &schedariu (micca ricumandatu) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignurà u sbagliu è cuntinuà (micca ricumandatu) +SourceIsCorrupted=U schedariu d’urigine hè alteratu +SourceDoesntExist=U schedariu d’urigine « %1 » ùn esiste micca +ExistingFileReadOnly2=U schedariu esistente hà un attributu di lettura-sola è ùn pò micca esse rimpiazzatu. +ExistingFileReadOnlyRetry=&Caccià l’attributu di lettura-sola è pruvà torna +ExistingFileReadOnlyKeepExisting=Cunservà u schedariu &esistente +ErrorReadingExistingDest=Un sbagliu hè accadutu pruvendu di leghje u schedariu esistente : +FileExistsSelectAction=Selezziunate un’azzione +FileExists2=U schedariu esiste dighjà. +FileExistsOverwriteExisting=&Rimpiazzà u schedariu chì esiste +FileExistsKeepExisting=Cunservà u schedariu &esistente +FileExistsOverwriteOrKeepAll=&Fà què per l’altri cunflitti +ExistingFileNewerSelectAction=Selezziunate un’azzione +ExistingFileNewer2=U schedariu esistente hè più recente chì quellu chì l’assistente prova d’installà. +ExistingFileNewerOverwriteExisting=&Rimpiazzà u schedariu chì esiste +ExistingFileNewerKeepExisting=Cunservà u schedariu &esistente (ricumandatu) +ExistingFileNewerOverwriteOrKeepAll=&Fà què per l’altri cunflitti +ErrorChangingAttr=Un sbagliu hè accadutu pruvendu di cambià l’attributi di u schedariu esistente : +ErrorCreatingTemp=Un sbagliu hè accadutu pruvendu di creà un schedariu in u cartulare di destinazione : +ErrorReadingSource=Un sbagliu hè accadutu pruvendu di leghje u schedariu d’urigine : +ErrorCopying=Un sbagliu hè accadutu pruvendu di cupià un schedariu : +ErrorReplacingExistingFile=Un sbagliu hè accadutu pruvendu di rimpiazzà u schedariu esistente : +ErrorRestartReplace=Fiascu di Rimpiazzamentu di schedariu à u riavviu di l’urdinatore : +ErrorRenamingTemp=Un sbagliu hè accadutu pruvendu di rinuminà un schedariu in u cartulare di destinazione : +ErrorRegisterServer=Impussibule d’arregistrà a bibliuteca DLL/OCX : %1 +ErrorRegSvr32Failed=Fiascu di RegSvr32 cù codice d’esciuta %1 +ErrorRegisterTypeLib=Impussibule d’arregistrà a bibliuteca di tipu : %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Tutti l’utilizatori +UninstallDisplayNameMarkCurrentUser=L’utilizatore attuale + +; *** Post-installation errors +ErrorOpeningReadme=Un sbagliu hè accadutu pruvendu d’apre u schedariu LISEZMOI o README. +ErrorRestartingComputer=L’assistente ùn hà micca pussutu ridimarrà l’urdinatore. Ci vole à fallu manualmente. + +; *** Uninstaller messages +UninstallNotFound=U schedariu « %1 » ùn esiste micca. Impussibule di disinstallà. +UninstallOpenError=U schedariu« %1 » ùn pò micca esse apertu. Impussibule di disinstallà +UninstallUnsupportedVer=U ghjurnale di disinstallazione « %1 » hè in una forma scunnisciuta da sta versione di l’assistente di disinstallazione. Impussibule di disinstallà +UninstallUnknownEntry=Un elementu scunisciutu (%1) hè statu trovu in u ghjurnale di disinstallazione +ConfirmUninstall=Site sicuru di vulè caccià cumpletamente %1 è tutti i so cumpunenti ? +UninstallOnlyOnWin64=St’appiecazione pò esse disinstallata solu cù una versione 64-bit di Windows. +OnlyAdminCanUninstall=St’appiecazione pò esse disinstallata solu da un utilizatore di u gruppu d’amministratori. +UninstallStatusLabel=Ci vole à aspettà chì %1 sia cacciatu di l’urdinatore. +UninstalledAll=%1 hè statu cacciatu bè da l’urdinatore. +UninstalledMost=A disinstallazione di %1 hè compia.%n%nQualchì elementu ùn pò micca esse cacciatu. Ci vole à cacciallu manualmente. +UninstalledAndNeedsRestart=Per compie a disinstallazione di %1, l’urdinatore deve esse ridimarratu.%n%nVulete ridimarrà l’urdinatore subitu ? +UninstallDataCorrupted=U schedariu « %1 » hè alteratu. Impussibule di disinstallà + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Caccià i schedarii sparti ? +ConfirmDeleteSharedFile2=U sistema indicheghja chì u schedariu spartu ùn hè più impiegatu da nisunu prugramma. Vulete chì a disinstallazione cacci stu schedariu spartu ?%n%nS’è qualchì prugramma impiegheghja sempre stu schedariu è ch’ellu hè cacciatu, quellu prugramma ùn puderà funziunà currettamente. S’è ùn site micca sicuru, sceglie Innò. Lascià stu schedariu nant’à u sistema ùn pò micca pruduce danni. +SharedFileNameLabel=Nome di schedariu : +SharedFileLocationLabel=Lucalizazione : +WizardUninstalling=Statu di disinstallazione +StatusUninstalling=Disinstallazione di %1… + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installazione di %1. +ShutdownBlockReasonUninstallingApp=Disinstallazione di %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versione %2 +AdditionalIcons=Accurtatoghji addizziunali : +CreateDesktopIcon=Creà un accurtatoghju nant’à u &scagnu +CreateQuickLaunchIcon=Creà un accurtatoghju nant’à a barra di &lanciu prontu +ProgramOnTheWeb=%1 nant’à u Web +UninstallProgram=Disinstallà %1 +LaunchProgram=Lancià %1 +AssocFileExtension=&Assucià %1 cù l’estensione di schedariu %2 +AssocingFileExtension=Associu di %1 cù l’estensione di schedariu %2… +AutoStartProgramGroupDescription=Lanciu autumaticu : +AutoStartProgram=Lanciu autumaticu di %1 +AddonHostProgramNotFound=Impussibule di truvà %1 in u cartulare selezziunatu.%n%nVulete cuntinuà l’installazione quantunque ? diff --git a/installer/innosetup/Languages/Croatian.isl b/installer/innosetup/Languages/Croatian.isl index b8d946b5a..7ebc5f41e 100644 --- a/installer/innosetup/Languages/Croatian.isl +++ b/installer/innosetup/Languages/Croatian.isl @@ -1,10 +1,10 @@ -; *** Inno Setup version 6.0.0+ Croatian messages *** +; *** Inno Setup version 6.1.0+ Croatian messages *** ; Translated by: Milo Ivir (mail@milotype.de) ; Based on translation by Elvis Gambiraža (el.gambo@gmail.com) ; Based on translation by Krunoslav Kanjuh (krunoslav.kanjuh@zg.t-com.hr) ; ; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ +; https://www.jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno @@ -42,7 +42,7 @@ ConfirmTitle=Potvrda ErrorTitle=Greška ; *** SetupLdr messages -SetupLdrStartupMessage=Ovime ćeš instalirati %1. Želiš li nastaviti? +SetupLdrStartupMessage=Ovime će se instalirati %1. Želiš li nastaviti? LdrCannotCreateTemp=Nije moguće stvoriti privremenu datoteku. Instalacija je prekinuta LdrCannotExecTemp=Nije moguće pokrenuti datoteku u privremenoj mapi. Instalacija je prekinuta HelpTextNote= @@ -54,23 +54,23 @@ SetupFileCorrupt=Datoteke instalacije su oštećene. Nabavi novu kopiju programa SetupFileCorruptOrWrongVer=Datoteke instalacije su oštećene ili nisu kompatibilne s ovom verzijom instalacije. Ispravi problem ili nabavi novu kopiju programa. InvalidParameter=Neispravan parametar je prenijet u naredbenom retku:%n%n%1 SetupAlreadyRunning=Instalacija je već pokrenuta. -WindowsVersionNotSupported=Program ne podržava verziju Windowsa koju koristite. +WindowsVersionNotSupported=Program ne podržava Windows verziju koju koristiš. WindowsServicePackRequired=Program zahtijeva %1 servisni paket %2 ili noviji. -NotOnThisPlatform=Ovaj program neće raditi na %1. -OnlyOnThisPlatform=Ovaj program se mora pokrenuti na %1. -OnlyOnTheseArchitectures=Ovaj program može biti instaliran na verziji Windowsa dizajniranim za sljedeću procesorsku arhitekturu:%n%n%1 -WinVersionTooLowError=Ovaj program zahtijeva %1 verziju %2 ili noviju. -WinVersionTooHighError=Ovaj program se ne može instalirati na %1 verziji %2 ili novijoj. -AdminPrivilegesRequired=Morate biti prijavljeni kao administrator prilikom instaliranja ovog programa. -PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili član grupe naprednih korisnika prilikom instaliranja ovog programa. -SetupAppRunningError=Instalacija je otkrila da je %1 pokrenut.%n%nZatvorite program i potom kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije. -UninstallAppRunningError=Deinstalacija je otkrila da je %1 pokrenut.%n%nZatvorite program i potom kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije. +NotOnThisPlatform=Program neće raditi na %1. +OnlyOnThisPlatform=Program se mora pokrenuti na %1. +OnlyOnTheseArchitectures=Program se može instalirati na Windows verzijama za sljedeće procesorske arhitekture:%n%n%1 +WinVersionTooLowError=Program zahtijeva %1 verziju %2 ili noviju. +WinVersionTooHighError=Program se ne može instalirati na %1 verziji %2 ili novijoj. +AdminPrivilegesRequired=Za instaliranje programa moraš biti prijavljen/a kao administrator. +PowerUserPrivilegesRequired=Za instaliranje programa moraš biti prijavljen/a kao administrator ili kao član grupe naprednih korisnika. +SetupAppRunningError=Instalacija je otkrila da je %1 trenutačno pokrenut.%n%nZatvori program i potom pritisni "Dalje" za nastavak ili "Odustani" za prekid. +UninstallAppRunningError=Deinstalacija je otkrila da je %1 trenutačno pokrenut.%n%nZatvori program i potom pritisni "Dalje" za nastavak ili "Odustani" za prekid. ; *** Startup questions -PrivilegesRequiredOverrideTitle=Odaberite način instaliranja -PrivilegesRequiredOverrideInstruction=Odaberite način instaliranja -PrivilegesRequiredOverrideText1=%1 se može instalirati za sve korisnike (zahtijeva administrativna prava) ili samo za vas. -PrivilegesRequiredOverrideText2=%1 se može instalirati samo za vas ili za sve korisnike (zahtijeva administrativna prava). +PrivilegesRequiredOverrideTitle=Odaberi način instaliranja +PrivilegesRequiredOverrideInstruction=Odaberi način instaliranja +PrivilegesRequiredOverrideText1=%1 se može instalirati za sve korisnike (potrebna su administratorska prava) ili samo za tebe. +PrivilegesRequiredOverrideText2=%1 se može instalirati samo za tebe ili za sve korisnike (potrebna su administratorska prava). PrivilegesRequiredOverrideAllUsers=Instaliraj z&a sve korisnike PrivilegesRequiredOverrideAllUsersRecommended=Instaliraj z&a sve korisnike (preporučeno) PrivilegesRequiredOverrideCurrentUser=Instaliraj samo za &mene @@ -78,14 +78,14 @@ PrivilegesRequiredOverrideCurrentUserRecommended=Instaliraj samo za &mene (prepo ; *** Misc. errors ErrorCreatingDir=Instalacija nije mogla stvoriti mapu "%1" -ErrorTooManyFilesInDir=Nemoguće stvaranje datoteke u mapi "%1", jer ona sadrži previše datoteka +ErrorTooManyFilesInDir=Datoteku nije moguće stvoriti u mapi "%1", jer mapa sadrži previše datoteka ; *** Setup common messages ExitSetupTitle=Prekini instalaciju -ExitSetupMessage=Instalacija nije završena. Ako sad izađete, program neće biti instaliran.%n%nInstalaciju možete pokrenuti kasnije, ukoliko ju želite završiti.%n%nPrekinuti instalaciju? +ExitSetupMessage=Instalacija nije završena. Ako sad izađeš, program neće biti instaliran.%n%nInstalaciju možeš pokrenuti kasnije, ukoliko je želiš dovršiti.%n%nPrekinuti instalaciju? AboutSetupMenuItem=&O instalaciji … AboutSetupTitle=O instalaciji -AboutSetupMessage=%1 verzija %2%n%3%n%n%1 početna stranica:%n%4 +AboutSetupMessage=%1 verzija %2%n%3%n%n%1 web-stranica:%n%4 AboutSetupNote= TranslatorNote=Prevodioci:%n%nKrunoslav Kanjuh%n%nElvis Gambiraža%n%nMilo Ivir @@ -105,105 +105,107 @@ ButtonWizardBrowse=Odabe&ri … ButtonNewFolder=&Stvori novu mapu ; *** "Select Language" dialog messages -SelectLanguageTitle=Odaberite jezik za instalaciju -SelectLanguageLabel=Odberite jezik koji želite koristiti tijekom instaliranja. +SelectLanguageTitle=Odaberi jezik za instalaciju +SelectLanguageLabel=Odaberi jezik koji želiš koristiti tijekom instaliranja. ; *** Common wizard text -ClickNext=Kliknite "Dalje" za nastavak ili "Odustani" za prekid instalacije. +ClickNext=Pritisni "Dalje" za nastavak ili "Odustani" za prekid instalacije. BeveledLabel= -BrowseDialogTitle=Odaberite mapu -BrowseDialogLabel=Odaberite mapu iz popisa te kliknite "U redu". +BrowseDialogTitle=Odaberi mapu +BrowseDialogLabel=Odaberi mapu iz popisa i pritisni "U redu". NewFolderName=Nova mapa ; *** "Welcome" wizard page -WelcomeLabel1=Dobro došli u instalaciju programa [name] -WelcomeLabel2=Ovaj program će instalirati [name/ver] na vaše računalo.%n%nPreporučamo da zatvorite sve programe prije nego što nastavite dalje. +WelcomeLabel1=Čarobnjak za instalaciju programa [name] +WelcomeLabel2=Ovime ćeš instalirati [name/ver].%n%nPreporučujemo da zatvoriš sve programe prije nego što nastaviš dalje. ; *** "Password" wizard page WizardPassword=Lozinka PasswordLabel1=Instalacija je zaštićena lozinkom. -PasswordLabel3=Upišite lozinku i kliknite "Dalje". Lozinke su osjetljive na mala i velika slova. +PasswordLabel3=Upiši lozinku i pritisni "Dalje". Lozinke su osjetljive na mala i velika slova. PasswordEditLabel=&Lozinka: -IncorrectPassword=Upisana je pogrešna lozinka. Pokušajte ponovo. +IncorrectPassword=Upisana je pogrešna lozinka. Pokušaj ponovo. ; *** "License Agreement" wizard page WizardLicense=Licencni ugovor -LicenseLabel=Prije nastavka pažljivo pročitajte sljedeće važne informacije. -LicenseLabel3=Pročitajte licencni ugovor. Morate prihvatiti uvjete ugovora kako biste nastavili s instaliranjem. +LicenseLabel=Prije nego što nastaviš dalje, pažljivo pročitaj sljedeće važne informacije. +LicenseLabel3=Pročitaj licencni ugovor. Moraš prihvatiti uvjete ugovora, ako želiš nastaviti instalirati. LicenseAccepted=&Prihvaćam ugovor LicenseNotAccepted=&Ne prihvaćam ugovor ; *** "Information" wizard pages WizardInfoBefore=Informacije -InfoBeforeLabel=Pročitajte sljedeće važne informacije prije nego što nastavite dalje. -InfoBeforeClickLabel=Kada ste spremni nastaviti s instaliranjem, kliknite "Dalje". +InfoBeforeLabel=Pročitaj sljedeće važne informacije prije nego što nastaviš dalje. +InfoBeforeClickLabel=Kad želiš nastaviti instalirati, pritisni "Dalje". WizardInfoAfter=Informacije -InfoAfterLabel=Pročitajte sljedeće važne informacije prije nego što nastavite dalje. -InfoAfterClickLabel=Kada ste spremni nastaviti s instaliranjem, kliknite "Dalje". +InfoAfterLabel=Pročitaj sljedeće važne informacije prije nego što nastaviš dalje. +InfoAfterClickLabel=Kad želiš nastaviti instalirati, pritisni "Dalje". ; *** "User Information" wizard page -WizardUserInfo=Informacije o korisniku -UserInfoDesc=Upišite informacije o vama. +WizardUserInfo=Korisnički podaci +UserInfoDesc=Upiši svoje podatke. UserInfoName=&Ime korisnika: UserInfoOrg=&Organizacija: UserInfoSerial=&Serijski broj: -UserInfoNameRequired=Morate upisati ime. +UserInfoNameRequired=Ime je obavezno polje. ; *** "Select Destination Location" wizard page -WizardSelectDir=Odaberite odredišno mjesto -SelectDirDesc=Gdje treba instalirati [name]? -SelectDirLabel3=Instalacija će instalirati [name] u sljedeću mapu. -SelectDirBrowseLabel=Za nastavak kliknite na "Dalje". Ako želite odabrati drugu mapu, kliknite na "Odaberi". +WizardSelectDir=Odaberi odredišno mjesto +SelectDirDesc=Gdje želiš instalirati [name]? +SelectDirLabel3=[name] će se instalirati u sljedeću mapu. +SelectDirBrowseLabel=Za nastavak instalacije, pritisni "Dalje". Za odabir jedne druge mape, pritisni "Odaberi". +DiskSpaceGBLabel=Potrebno je barem [gb] GB slobodnog prostora na disku. DiskSpaceMBLabel=Potrebno je barem [mb] MB slobodnog prostora na disku. CannotInstallToNetworkDrive=Instalacija ne može instalirati na mrežnu jedinicu. CannotInstallToUNCPath=Instalacija ne može instalirati na UNC stazu. -InvalidPath=Morate unijeti punu stazu zajedno sa slovom diska, npr.:%n%nC:\APP%n%nili UNC stazu u obliku:%n%n\\server\share -InvalidDrive=Disk koji ste odabrali ne postoji. Odaberite neki drugi. +InvalidPath=Moraš upisati punu stazu zajedno sa slovom diska, npr.:%n%nC:\APP%n%nili UNC stazu u obliku:%n%n\\server\share +InvalidDrive=Odabrani disk ne postoji. Odaberi jedan drugi. DiskSpaceWarningTitle=Nedovoljno prostora na disku -DiskSpaceWarning=Instalacija zahtijeva barem %1 KB slobodnog prostora, a odabrani disk ima samo %2 KB na raspolaganju.%n%nŽelite li svejedno nastaviti? +DiskSpaceWarning=Instalacija treba barem %1 KB slobodnog prostora, no odabrani disk ima samo %2 KB.%n%nSvejedno nastaviti? DirNameTooLong=Naziv mape ili staze je predugačak. InvalidDirName=Naziv mape je neispravan. -BadDirName32=Naziv mape ne smije sadržavati niti jedan od sljedećih znakova:%n%n%1 +BadDirName32=Naziv mape ne smije sadržavati sljedeće znakove:%n%n%1 DirExistsTitle=Mapa već postoji -DirExists=Mapa:%n%n%1%n%nveć postoji. Želite li svejedno u nju instalirati? +DirExists=Mapa:%n%n%1%n%nveć postoji. Želiš li svejedno u nju instalirati? DirDoesntExistTitle=Mapa ne postoji -DirDoesntExist=The folder:%n%n%1%n%nne postoji. Želite li ju stvoriti? +DirDoesntExist=Mapa:%n%n%1%n%nne postoji. Želiš li je stvoriti? ; *** "Select Components" wizard page -WizardSelectComponents=Odaberite komponente -SelectComponentsDesc=Koje komponente želite instalirati? -SelectComponentsLabel2=Odaberite komponente koje želite instalirati, isključite komponente koje ne želite instalirati. Za nastavak kliknite na "Dalje". +WizardSelectComponents=Odaberi komponente +SelectComponentsDesc=Koje komponente želiš instalirati? +SelectComponentsLabel2=Odaberi komponente koje želiš instalirati, isključi komponente koje ne želiš instalirati. Za nastavak instalacije pritisni "Dalje". FullInstallation=Kompletna instalacija ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Kompaktna instalacija CustomInstallation=Prilagođena instalacija NoUninstallWarningTitle=Postojeće komponente -NoUninstallWarning=Instalacija je utvrdila da na vašem računalu već postoje sljedeće komponente:%n%n%1%n%nIsključivanjem tih komponenata, one neće biti deinstalirane.%n%nŽelite li ipak nastaviti? +NoUninstallWarning=Instalacija je utvrdila da na tvom računalu već postoje sljedeće komponente:%n%n%1%n%nIsključivanjem tih komponenata, one se neće deinstalirati.%n%nŽeliš li svejedno nastaviti? ComponentSize1=%1 KB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Trenutačni odabir zahtijeva barem [gb] GB na disku. ComponentsDiskSpaceMBLabel=Trenutačni odabir zahtijeva barem [mb] MB na disku. ; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Odaberite dodatne zadatke -SelectTasksDesc=Koje dodatne zadatke želite izvršiti? -SelectTasksLabel2=Odaberite zadatke koje želite izvršiti tijekom instaliranja programa [name], zatim kliknite "Dalje". +WizardSelectTasks=Odaberi dodatne zadatke +SelectTasksDesc=Koje dodatne zadatke želiš izvršiti? +SelectTasksLabel2=Odaberi zadatke koje želiš izvršiti tijekom instaliranja programa [name], zatim pritisni "Dalje". ; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Odaberite mapu iz "Start" izbornika -SelectStartMenuFolderDesc=Gdje želite da instalacija spremi programske prečace? +WizardSelectProgramGroup=Odaberi mapu iz "Start" izbornika +SelectStartMenuFolderDesc=Gdje želiš da instalacija spremi programske prečace? SelectStartMenuFolderLabel3=Instalacija će stvoriti programske prečace u sljedeću mapu "Start" izbornika. -SelectStartMenuFolderBrowseLabel=Kliknite "Dalje" za nastavak ili "Odaberi" za odabir jedne druge mape. -MustEnterGroupName=Morate upisati naziv mape. -GroupNameTooLong=Naziv mape ili staze je predug. +SelectStartMenuFolderBrowseLabel=Ako želiš nastaviti, pritisni "Dalje". Ako želiš odabrati jednu drugu mapu, pritisni "Odaberi". +MustEnterGroupName=Moraš upisati naziv mape. +GroupNameTooLong=Naziv mape ili staze je predugačak. InvalidGroupName=Naziv mape nije ispravan. BadGroupName=Naziv mape ne smije sadržavati sljedeće znakove:%n%n%1 NoProgramGroupCheck2=&Ne stvaraj mapu u "Start" izborniku ; *** "Ready to Install" wizard page WizardReady=Sve je spremno za instaliranje -ReadyLabel1=Instalacija je spremna za instaliranje [name] na vaše računalo. -ReadyLabel2a=Kliknite "Instaliraj" ako želite instalirati program ili "Natrag" ako želite pregledati ili promijeniti postavke -ReadyLabel2b=Kliknite "Instaliraj" ako želite instalirati program. +ReadyLabel1=Instalacija je spremna za instaliranje programa [name]. +ReadyLabel2a=Pritisni "Instaliraj", ako želiš instalirati program. Pritisni "Natrag", ako želiš pregledati ili promijeniti postavke +ReadyLabel2b=Pritisni "Instaliraj", ako želiš instalirati program. ReadyMemoUserInfo=Korisnički podaci: ReadyMemoDir=Odredišno mjesto: ReadyMemoType=Vrsta instalacije: @@ -211,31 +213,44 @@ ReadyMemoComponents=Odabrane komponente: ReadyMemoGroup=Mapa u "Start" izborniku: ReadyMemoTasks=Dodatni zadaci: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Preuzimanje dodatnih datoteka … +ButtonStopDownload=&Prekini preuzimanje +StopDownload=Stvarno želiš prekinuti preuzimanje? +ErrorDownloadAborted=Preuzimanje je prekinuto +ErrorDownloadFailed=Neuspjelo preuzimanje: %1 %2 +ErrorDownloadSizeFailed=Neuspjelo dohvaćanje veličine: %1 %2 +ErrorFileHash1=Izračunavanje kontrolnog zbroja datoteke neuspjelo: %1 +ErrorFileHash2=Neispravan kontrolni zbroj datoteke: očekivano %1, pronađeno %2 +ErrorProgress=Neispravan napredak: %1 od %2 +ErrorFileSize=Neispravna veličina datoteke: očekivano %1, pronađeno %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Priprema za instaliranje -PreparingDesc=Instalacija se priprema za instaliranje [name] na vaše računalo. -PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. -CannotContinue=Instalacija ne može nastaviti. Kliknite na "Odustani" za izlaz. -ApplicationsFound=Sljedeći programi koriste datoteke koje instalacija mora aktualiziranti. Preporučamo da dopustite instalaciji da zatvori ove programe. -ApplicationsFound2=Sljedeći programi koriste datoteke koje instalacija mora aktualiziranti. Preporučamo da dopustite instalaciji da zatvori ove programe. Kad instaliranje završi, instalacija će pokušati ponovo pokrenuti programe. +PreparingDesc=Instalacija se priprema za instaliranje programa [name]. +PreviousInstallNotCompleted=Instaliranje/uklanjanje jednog prethodnog programa nije bilo gotovo. Morat ćeš ponovo pokrenuti računalo i dovršiti to instaliranje.%n%nNakon ponovnog pokretanja računala, pokreni instalaciju ponovo, kako bi se dovršilo instaliranje programa [name]. +CannotContinue=Instalacija ne može nastaviti rad. Pritisni "Odustani" za izlaz iz instalacije. +ApplicationsFound=Sljedeći programi koriste datoteke koje instalacija mora aktualizirati. Preporučujemo da dopustiš instalaciji zatvoriti ove programe. +ApplicationsFound2=Sljedeći programi koriste datoteke koje instalacija mora aktualizirati. Preporučujemo da dopustiš instalaciji zatvoriti ove programe. Kad instaliranje završi, instalacija će pokušati ponovo pokrenuti programe. CloseApplications=&Zatvori programe automatski DontCloseApplications=&Ne zatvaraj programe -ErrorCloseApplications=Instalacija nij uspjela automatski zatvoriti programe. Preporučamo da zatvorite sve programe koji koriste datoteke, koje se moraju aktulaizirati. +ErrorCloseApplications=Instalacija nije uspjela automatski zatvoriti programe. Preporučujemo da zatvoriš sve programe koji koriste datoteke koje se moraju aktualizirati. +PrepareToInstallNeedsRestart=Instalacija mora ponovo pokrenuti računalo. Nakon ponovnog pokretanja računala, pokreni instalaciju ponovo, kako bi se dovršilo instaliranje programa [name].%n%nŽeliš li sada ponovo pokrenuti računalo? ; *** "Installing" wizard page WizardInstalling=Instaliranje -InstallingLabel=Pričekajte dok ne završi instaliranje programa [name] na vaše računalo. +InstallingLabel=Pričekaj dok ne završi instaliranje programa [name]. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Završavanje instalacijskog čarobnjaka za [name] -FinishedLabelNoIcons=Instalacija je završila instaliranje programa [name] na vaše računalo. -FinishedLabel=Instalacija je završila instaliranje programa [name] na vaše računalo. Program se može pokrenuti pomoću instaliranih prečaca. -ClickFinish=Kliknite na "Završi" kako biste izašli iz instalacije. -FinishedRestartLabel=Kako biste završili instaliranje programa [name], potrebno je ponovo pokrenuti računalo. Želite li to sada učiniti? -FinishedRestartMessage=Kako biste završili instaliranje programa [name], potrebno je ponovo pokrenuti računalo.%n%nŽelite li to sada učiniti? +FinishedLabelNoIcons=Instalacija je završila instaliranje programa [name]. +FinishedLabel=Instalacija je završila instaliranje programa [name]. Program se može pokrenuti pomoću instaliranih prečaca. +ClickFinish=Za izlaz iz instalacije pritisni "Završi". +FinishedRestartLabel=Za završavanje instaliranja programa [name], instalacija mora ponovo pokrenuti računalo. Želiš li sada ponovo pokrenuti računalo? +FinishedRestartMessage=Za završavanje instaliranja programa [name], instalacija mora ponovo pokrenuti računalo.%n%nŽeliš li sada ponovo pokrenuti računalo? ShowReadmeCheck=Da, želim pročitati README datoteku -YesRadio=&Da, želim sad ponovo pokrenuti računalo -NoRadio=&Ne, kasnije ću ponovo pokrenuti računalo +YesRadio=&Da, sada ponovo pokrenuti računalo +NoRadio=&Ne, računalo ću kasnije ponovo pokrenuti ; used for example as 'Run MyProg.exe' RunEntryExec=Pokreni %1 ; used for example as 'View Readme.txt' @@ -243,14 +258,14 @@ RunEntryShellExec=Prikaži %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Instalacija treba sljedeći disk -SelectDiskLabel2=Umetnite disk %1 i kliknite na "U redu".%n%nAko se datoteke s ovog diska nalaze na nekom drugom mjestu od prikazanog ispod, upišite ispravnu stazu ili kliknite na "Odaberi". +SelectDiskLabel2=Umetni disk %1 i pritisni "U redu".%n%nAko se datoteke s ovog diska nalaze na nekom drugom mjestu od dolje prikazanog, upiši ispravnu stazu ili pritisni "Odaberi". PathLabel=&Staza: -FileNotInDir2=Staza "%1" ne postoji u "%2". Umetnite odgovarajući disk ili odaberite jednu drugu mapu. -SelectDirectoryLabel=Odaberite mjesto sljedećeg diska. +FileNotInDir2=Staza "%1" ne postoji u "%2". Umetni odgovarajući disk ili odaberi jednu drugu mapu. +SelectDirectoryLabel=Odredi mjesto sljedećeg diska. ; *** Installation phase messages -SetupAborted=Instalacija nije završena.%n%nIspravite problem i ponovo pokrenite instalaciju. -AbortRetryIgnoreSelectAction=Odaberite radnju +SetupAborted=Instalacija nije završena.%n%nIspravi problem i ponovo pokreni instalaciju. +AbortRetryIgnoreSelectAction=Odaberi radnju AbortRetryIgnoreRetry=&Pokušaj ponovo AbortRetryIgnoreIgnore=&Zanemari grešku i nastavi AbortRetryIgnoreCancel=Prekini s instaliranjem @@ -270,10 +285,10 @@ StatusRollback=Poništavanje promjena … ; *** Misc. errors ErrorInternal2=Interna greška: %1 -ErrorFunctionFailedNoCode=%1 nije uspjelo -ErrorFunctionFailed=%1 nije uspjelo; kod %2 -ErrorFunctionFailedWithMessage=%1 failed; kod %2.%n%3 -ErrorExecutingProgram=Nije moguće pokrenuti datoteku:%n%1 +ErrorFunctionFailedNoCode=%1 – neuspjelo +ErrorFunctionFailed=%1 – neuspjelo; kod %2 +ErrorFunctionFailedWithMessage=%1 – neuspjelo; kod %2.%n%3 +ErrorExecutingProgram=Nije moguće izvršiti datoteku:%n%1 ; *** Registry errors ErrorRegOpenKey=Greška prilikom otvaranja ključa registra:%n%1\%2 @@ -284,17 +299,25 @@ ErrorRegWriteKey=Greška prilikom pisanja u ključ registra:%n%1\%2 ErrorIniEntry=Greška prilikom stvaranja INI unosa u datoteci "%1". ; *** File copying errors -FileAbortRetryIgnoreSkipNotRecommended=&Preskoči ovu datoteku (ne preporuča se) -FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (ne preporuča se) -SourceIsCorrupted=Izvorišna datoteka je oštećena -SourceDoesntExist=Izvorišna datoteka "%1" ne postoji +FileAbortRetryIgnoreSkipNotRecommended=&Preskoči ovu datoteku (ne preporučuje se) +FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari grešku i nastavi (ne preporučuje se) +SourceIsCorrupted=Izvorna datoteka je oštećena +SourceDoesntExist=Izvorna datoteka "%1" ne postoji ExistingFileReadOnly2=Postojeću datoteku nije bilo moguće zamijeniti, jer je označena sa "samo-za-čitanje". -ExistingFileReadOnlyRetry=&Uklonite atribut "samo-za-čitanje" i pokušajte ponovo +ExistingFileReadOnlyRetry=&Ukloni svojstvo "samo-za-čitanje" i pokušaj ponovo ExistingFileReadOnlyKeepExisting=&Zadrži postojeću datoteku ErrorReadingExistingDest=Pojavila se greška prilikom pokušaja čitanja postojeće datoteke: -FileExists=The file already exists.%n%nŽelite li da ju instalacija prepiše? -ExistingFileNewer=Postojeća datoteka je novija od one, koju pokušavate instalirati. Preporuča se da zadržite postojeću datoteku.%n%nŽelite li zadržati postojeću datoteku? -ErrorChangingAttr=Pojavila se greška prilikom pokušaja promjene atributa postojeće datoteke: +FileExistsSelectAction=Odaberi radnju +FileExists2=Datoteka već postoji. +FileExistsOverwriteExisting=&Prepiši postojeću datoteku +FileExistsKeepExisting=&Zadrži postojeću datoteku +FileExistsOverwriteOrKeepAll=&Uradi to i u narednim slučajevima +ExistingFileNewerSelectAction=Odaberi radnju +ExistingFileNewer2=Postojeća datoteka je novija od one koja se pokušava instalirati. +ExistingFileNewerOverwriteExisting=&Prepiši postojeću datoteku +ExistingFileNewerKeepExisting=&Zadrži postojeću datoteku (preporučeno) +ExistingFileNewerOverwriteOrKeepAll=&Uradi to i u narednim slučajevima +ErrorChangingAttr=Pojavila se greška prilikom pokušaja promjene svojstva postojeće datoteke: ErrorCreatingTemp=Pojavila se greška prilikom pokušaja stvaranja datoteke u odredišnoj mapi: ErrorReadingSource=Pojavila se greška prilikom pokušaja čitanja izvorišne datoteke: ErrorCopying=Pojavila se greška prilikom pokušaja kopiranja datoteke: @@ -303,7 +326,7 @@ ErrorRestartReplace=Zamijenjivanje nakon ponovnog pokretanja nije uspjelo: ErrorRenamingTemp=Pojavila se greška prilikom pokušaja preimenovanja datoteke u odredišnoj mapi: ErrorRegisterServer=Nije moguće registrirati DLL/OCX: %1 ErrorRegSvr32Failed=Greška u RegSvr32. Izlazni kod %1 -ErrorRegisterTypeLib=Nije moguće registrirati type library: %1 +ErrorRegisterTypeLib=Nije moguće registrirati biblioteku vrsta: %1 ; *** Uninstall display name markings ; used for example as 'My Program (32-bit)' @@ -317,25 +340,25 @@ UninstallDisplayNameMarkCurrentUser=Trenutačni korisnik ; *** Post-installation errors ErrorOpeningReadme=Pojavila se greška prilikom pokušaja otvaranja README datoteke. -ErrorRestartingComputer=Instalacija nije mogla ponovo pokrenuti računalo. Učinite to ručno. +ErrorRestartingComputer=Instalacija nije mogla ponovo pokrenuti računalo. Učini to ručno. ; *** Uninstaller messages UninstallNotFound=Datoteka "%1" ne postoji. Deinstaliranje nije moguće. UninstallOpenError=Datoteku "%1" nije bilo moguće otvoriti. Deinstaliranje nije moguće UninstallUnsupportedVer=Deinstalacijska datoteka "%1" je u formatu koji ova verzija deinstalacijskog programa ne prepoznaje. Deinstaliranje nije moguće -UninstallUnknownEntry=Nepoznat zapis (%1) je pronađen u deinstalacijskoj datoteci -ConfirmUninstall=Zaista želite ukloniti %1 i sve pripadajuće komponente? +UninstallUnknownEntry=Pronađen je nepoznat zapis (%1) u deinstalacijskoj datoteci +ConfirmUninstall=Zaista želiš ukloniti %1 i sve pripadajuće komponente? UninstallOnlyOnWin64=Ovu instalaciju je moguće ukloniti samo na 64-bitnom Windows sustavu. -OnlyAdminCanUninstall=Ovu instalaciju je moguće ukloniti samo korisnik s administrativnim pravima. -UninstallStatusLabel=Pričekajte dok se %1 uklanja s vašeg računala. -UninstalledAll=%1 je uspješno uklonjen s vašeg računala. -UninstalledMost=Deinstaliranje programa %1 je završeno.%n%nNeke elemente nije bilo moguće ukloniti. Mogu se ukloniti ručno. -UninstalledAndNeedsRestart=Kako biste završili deinstalirati %1, morate ponovo pokrenuti vaše računalo%n%nŽelite li to sad učiniti? +OnlyAdminCanUninstall=Ovu instalaciju može ukloniti samo korisnik s administratorskim pravima. +UninstallStatusLabel=Pričekaj dok se %1 uklanja s računala. +UninstalledAll=%1 je uspješno uklonjen s računala. +UninstalledMost=Deinstaliranje programa %1 je završeno.%n%nNeke elemente nije bilo moguće ukloniti. Oni se mogu ukloniti ručno. +UninstalledAndNeedsRestart=Za završavanje deinstaliranja programa %1, potrebno je ponovo pokrenuti računalo.%n%nŽeliš li to sada učiniti? UninstallDataCorrupted="%1" datoteka je oštećena. Deinstaliranje nije moguće ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Ukloniti dijeljene datoteke? -ConfirmDeleteSharedFile2=Sustav ukazuje na to, da sljedeće dijeljenu datoteku ne koristi niti jedan program. Želite li ukloniti tu dijeljenu datoteku?%n%nAko neki programi i dalje koriste tu datoteku, a ona se izbriše, ti programi neće ispravno raditi. Ako niste sigurni, odaberite "Ne". Datoteka neće štetiti vašem sustavu. +ConfirmDeleteSharedFile2=Sustav ukazuje na to, da sljedeću dijeljenu datoteku ne koristi niti jedan program. Želiš li ukloniti tu dijeljenu datoteku?%n%nAko neki programi i dalje koriste tu datoteku, a ona se izbriše, ti programi neće ispravno raditi. Ako ne znaš, odaberi "Ne". Datoteka neće štetiti tvom sustavu. SharedFileNameLabel=Datoteka: SharedFileLocationLabel=Mjesto: WizardUninstalling=Stanje deinstalacije @@ -361,4 +384,4 @@ AssocFileExtension=&Poveži program %1 s datotečnim nastavkom %2 AssocingFileExtension=Povezivanje programa %1 s datotečnim nastavkom %2 … AutoStartProgramGroupDescription=Pokretanje: AutoStartProgram=Automatski pokreni %1 -AddonHostProgramNotFound=%1 nije nađen u odabranoj mapi.%n%nŽelite li svejedno nastaviti? +AddonHostProgramNotFound=%1 nije nađen u odabranoj mapi.%n%nŽeliš li svejedno nastaviti? diff --git a/installer/innosetup/Languages/Czech.isl b/installer/innosetup/Languages/Czech.isl new file mode 100644 index 000000000..9e37db5eb --- /dev/null +++ b/installer/innosetup/Languages/Czech.isl @@ -0,0 +1,378 @@ +; ******************************************************* +; *** *** +; *** Inno Setup version 6.1.0+ Czech messages *** +; *** *** +; *** Original Author: *** +; *** *** +; *** Ivo Bauer (bauer@ozm.cz) *** +; *** *** +; *** Contributors: *** +; *** *** +; *** Lubos Stanek (lubek@users.sourceforge.net) *** +; *** Vitezslav Svejdar (vitezslav.svejdar@cuni.cz) *** +; *** Jiri Fenz (jirifenz@gmail.com) *** +; *** *** +; ******************************************************* + +[LangOptions] +LanguageName=<010C>e<0161>tina +LanguageID=$0405 +LanguageCodePage=1250 + +[Messages] + +; *** Application titles +SetupAppTitle=Prvodce instalac +SetupWindowTitle=Prvodce instalac - %1 +UninstallAppTitle=Prvodce odinstalac +UninstallAppFullTitle=Prvodce odinstalac - %1 + +; *** Misc. common +InformationTitle=Informace +ConfirmTitle=Potvrzen +ErrorTitle=Chyba + +; *** SetupLdr messages +SetupLdrStartupMessage=Vt Vs prvodce instalac produktu %1. Chcete pokraovat? +LdrCannotCreateTemp=Nelze vytvoit doasn soubor. Prvodce instalac bude ukonen +LdrCannotExecTemp=Nelze spustit soubor v doasn sloce. Prvodce instalac bude ukonen +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nChyba %2: %3 +SetupFileMissing=Instalan sloka neobsahuje soubor %1. Opravte prosm tuto chybu nebo si opatete novou kopii tohoto produktu. +SetupFileCorrupt=Soubory prvodce instalac jsou pokozeny. Opatete si prosm novou kopii tohoto produktu. +SetupFileCorruptOrWrongVer=Soubory prvodce instalac jsou pokozeny nebo se nesluuj s touto verz prvodce instalac. Opravte prosm tuto chybu nebo si opatete novou kopii tohoto produktu. +InvalidParameter=Pkazov dek obsahuje neplatn parametr:%n%n%1 +SetupAlreadyRunning=Prvodce instalac je ji sputn. +WindowsVersionNotSupported=Tento produkt nepodporuje verzi MS Windows, kter b na Vaem potai. +WindowsServicePackRequired=Tento produkt vyaduje %1 Service Pack %2 nebo vy. +NotOnThisPlatform=Tento produkt nelze spustit ve %1. +OnlyOnThisPlatform=Tento produkt mus bt sputn ve %1. +OnlyOnTheseArchitectures=Tento produkt lze nainstalovat pouze ve verzch MS Windows s podporou architektury procesor:%n%n%1 +WinVersionTooLowError=Tento produkt vyaduje %1 verzi %2 nebo vy. +WinVersionTooHighError=Tento produkt nelze nainstalovat ve %1 verzi %2 nebo vy. +AdminPrivilegesRequired=K instalaci tohoto produktu muste bt pihleni s oprvnnmi sprvce. +PowerUserPrivilegesRequired=K instalaci tohoto produktu muste bt pihleni s oprvnnmi sprvce nebo lena skupiny Power Users. +SetupAppRunningError=Prvodce instalac zjistil, e produkt %1 je nyn sputn.%n%nZavete prosm vechny instance tohoto produktu a pak pokraujte klepnutm na tlatko OK, nebo ukonete instalaci tlatkem Zruit. +UninstallAppRunningError=Prvodce odinstalac zjistil, e produkt %1 je nyn sputn.%n%nZavete prosm vechny instance tohoto produktu a pak pokraujte klepnutm na tlatko OK, nebo ukonete odinstalaci tlatkem Zruit. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Vbr reimu prvodce instalac +PrivilegesRequiredOverrideInstruction=Zvolte reim instalace +PrivilegesRequiredOverrideText1=Produkt %1 lze nainstalovat pro vechny uivatele (muste bt pihleni s oprvnnmi sprvce), nebo pouze pro Vs. +PrivilegesRequiredOverrideText2=Produkt %1 lze nainstalovat pouze pro Vs, nebo pro vechny uivatele (muste bt pihleni s oprvnnmi sprvce). +PrivilegesRequiredOverrideAllUsers=Nainstalovat pro &vechny uivatele +PrivilegesRequiredOverrideAllUsersRecommended=Nainstalovat pro &vechny uivatele (doporuuje se) +PrivilegesRequiredOverrideCurrentUser=Nainstalovat pouze pro &m +PrivilegesRequiredOverrideCurrentUserRecommended=Nainstalovat pouze pro &m (doporuuje se) + +; *** Misc. errors +ErrorCreatingDir=Prvodci instalac se nepodailo vytvoit sloku "%1" +ErrorTooManyFilesInDir=Nelze vytvoit soubor ve sloce "%1", protoe tato sloka ji obsahuje pli mnoho soubor + +; *** Setup common messages +ExitSetupTitle=Ukonit prvodce instalac +ExitSetupMessage=Instalace nebyla zcela dokonena. Jestlie nyn prvodce instalac ukonte, produkt nebude nainstalovn.%n%nPrvodce instalac mete znovu spustit kdykoliv jindy a instalaci dokonit.%n%nChcete prvodce instalac ukonit? +AboutSetupMenuItem=&O prvodci instalac... +AboutSetupTitle=O prvodci instalac +AboutSetupMessage=%1 verze %2%n%3%n%n%1 domovsk strnka:%n%4 +AboutSetupNote= +TranslatorNote=Czech translation maintained by Ivo Bauer (bauer@ozm.cz), Lubos Stanek (lubek@users.sourceforge.net), Vitezslav Svejdar (vitezslav.svejdar@cuni.cz) and Jiri Fenz (jirifenz@gmail.com) + +; *** Buttons +ButtonBack=< &Zpt +ButtonNext=&Dal > +ButtonInstall=&Instalovat +ButtonOK=OK +ButtonCancel=Zruit +ButtonYes=&Ano +ButtonYesToAll=Ano &vem +ButtonNo=&Ne +ButtonNoToAll=N&e vem +ButtonFinish=&Dokonit +ButtonBrowse=&Prochzet... +ButtonWizardBrowse=&Prochzet... +ButtonNewFolder=&Vytvoit novou sloku + +; *** "Select Language" dialog messages +SelectLanguageTitle=Vbr jazyka prvodce instalac +SelectLanguageLabel=Zvolte jazyk, kter se m pout bhem instalace. + +; *** Common wizard text +ClickNext=Pokraujte klepnutm na tlatko Dal, nebo ukonete prvodce instalac tlatkem Zruit. +BeveledLabel= +BrowseDialogTitle=Vyhledat sloku +BrowseDialogLabel=Z ne uvedenho seznamu vyberte sloku a klepnte na tlatko OK. +NewFolderName=Nov sloka + +; *** "Welcome" wizard page +WelcomeLabel1=Vt Vs prvodce instalac produktu [name]. +WelcomeLabel2=Produkt [name/ver] bude nainstalovn na V pota.%n%nDve ne budete pokraovat, doporuuje se zavt veker sputn aplikace. + +; *** "Password" wizard page +WizardPassword=Heslo +PasswordLabel1=Tato instalace je chrnna heslem. +PasswordLabel3=Zadejte prosm heslo a pokraujte klepnutm na tlatko Dal. Pi zadvn hesla rozliujte mal a velk psmena. +PasswordEditLabel=&Heslo: +IncorrectPassword=Zadan heslo nen sprvn. Zkuste to prosm znovu. + +; *** "License Agreement" wizard page +WizardLicense=Licenn smlouva +LicenseLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. +LicenseLabel3=Pette si prosm nsledujc licenn smlouvu. Aby instalace mohla pokraovat, muste souhlasit s podmnkami tto smlouvy. +LicenseAccepted=&Souhlasm s podmnkami licenn smlouvy +LicenseNotAccepted=&Nesouhlasm s podmnkami licenn smlouvy + +; *** "Information" wizard pages +WizardInfoBefore=Informace +InfoBeforeLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. +InfoBeforeClickLabel=Pokraujte v instalaci klepnutm na tlatko Dal. +WizardInfoAfter=Informace +InfoAfterLabel=Dve ne budete pokraovat, pette si prosm pozorn nsledujc dleit informace. +InfoAfterClickLabel=Pokraujte v instalaci klepnutm na tlatko Dal. + +; *** "User Information" wizard page +WizardUserInfo=Informace o uivateli +UserInfoDesc=Zadejte prosm poadovan daje. +UserInfoName=&Uivatelsk jmno: +UserInfoOrg=&Spolenost: +UserInfoSerial=S&riov slo: +UserInfoNameRequired=Muste zadat uivatelsk jmno. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Zvolte clov umstn +SelectDirDesc=Kam m bt produkt [name] nainstalovn? +SelectDirLabel3=Prvodce nainstaluje produkt [name] do nsledujc sloky. +SelectDirBrowseLabel=Pokraujte klepnutm na tlatko Dal. Chcete-li zvolit jinou sloku, klepnte na tlatko Prochzet. +DiskSpaceGBLabel=Instalace vyaduje nejmn [gb] GB volnho msta na disku. +DiskSpaceMBLabel=Instalace vyaduje nejmn [mb] MB volnho msta na disku. +CannotInstallToNetworkDrive=Prvodce instalac neme instalovat do sov jednotky. +CannotInstallToUNCPath=Prvodce instalac neme instalovat do cesty UNC. +InvalidPath=Muste zadat plnou cestu vetn psmene jednotky; napklad:%n%nC:\Aplikace%n%nnebo cestu UNC ve tvaru:%n%n\\server\sdlen sloka +InvalidDrive=Vmi zvolen jednotka nebo cesta UNC neexistuje nebo nen dostupn. Zvolte prosm jin umstn. +DiskSpaceWarningTitle=Nedostatek msta na disku +DiskSpaceWarning=Prvodce instalac vyaduje nejmn %1 KB volnho msta pro instalaci produktu, ale na zvolen jednotce je dostupnch pouze %2 KB.%n%nChcete pesto pokraovat? +DirNameTooLong=Nzev sloky nebo cesta jsou pli dlouh. +InvalidDirName=Nzev sloky nen platn. +BadDirName32=Nzev sloky neme obsahovat dn z nsledujcch znak:%n%n%1 +DirExistsTitle=Sloka existuje +DirExists=Sloka:%n%n%1%n%nji existuje. M se pesto instalovat do tto sloky? +DirDoesntExistTitle=Sloka neexistuje +DirDoesntExist=Sloka:%n%n%1%n%nneexistuje. M bt tato sloka vytvoena? + +; *** "Select Components" wizard page +WizardSelectComponents=Zvolte sousti +SelectComponentsDesc=Jak sousti maj bt nainstalovny? +SelectComponentsLabel2=Zakrtnte sousti, kter maj bt nainstalovny; sousti, kter se nemaj instalovat, ponechte nezakrtnut. Pokraujte klepnutm na tlatko Dal. +FullInstallation=pln instalace +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompaktn instalace +CustomInstallation=Voliteln instalace +NoUninstallWarningTitle=Sousti existuj +NoUninstallWarning=Prvodce instalac zjistil, e nsledujc sousti jsou ji na Vaem potai nainstalovny:%n%n%1%n%nNezahrnete-li tyto sousti do vbru, nebudou nyn odinstalovny.%n%nChcete pesto pokraovat? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Vybran sousti vyaduj nejmn [gb] GB msta na disku. +ComponentsDiskSpaceMBLabel=Vybran sousti vyaduj nejmn [mb] MB msta na disku. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Zvolte dal lohy +SelectTasksDesc=Kter dal lohy maj bt provedeny? +SelectTasksLabel2=Zvolte dal lohy, kter maj bt provedeny v prbhu instalace produktu [name], a pak pokraujte klepnutm na tlatko Dal. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Vyberte sloku v nabdce Start +SelectStartMenuFolderDesc=Kam m prvodce instalac umstit zstupce aplikace? +SelectStartMenuFolderLabel3=Prvodce instalac vytvo zstupce aplikace v nsledujc sloce nabdky Start. +SelectStartMenuFolderBrowseLabel=Pokraujte klepnutm na tlatko Dal. Chcete-li zvolit jinou sloku, klepnte na tlatko Prochzet. +MustEnterGroupName=Muste zadat nzev sloky. +GroupNameTooLong=Nzev sloky nebo cesta jsou pli dlouh. +InvalidGroupName=Nzev sloky nen platn. +BadGroupName=Nzev sloky neme obsahovat dn z nsledujcch znak:%n%n%1 +NoProgramGroupCheck2=&Nevytvet sloku v nabdce Start + +; *** "Ready to Install" wizard page +WizardReady=Instalace je pipravena +ReadyLabel1=Prvodce instalac je nyn pipraven nainstalovat produkt [name] na V pota. +ReadyLabel2a=Pokraujte v instalaci klepnutm na tlatko Instalovat. Pejete-li si zmnit nkter nastaven instalace, klepnte na tlatko Zpt. +ReadyLabel2b=Pokraujte v instalaci klepnutm na tlatko Instalovat. +ReadyMemoUserInfo=Informace o uivateli: +ReadyMemoDir=Clov umstn: +ReadyMemoType=Typ instalace: +ReadyMemoComponents=Vybran sousti: +ReadyMemoGroup=Sloka v nabdce Start: +ReadyMemoTasks=Dal lohy: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Stahuj se dal soubory... +ButtonStopDownload=&Zastavit stahovn +StopDownload=Urit chcete stahovn zastavit? +ErrorDownloadAborted=Stahovn perueno +ErrorDownloadFailed=Stahovn selhalo: %1 %2 +ErrorDownloadSizeFailed=Nepodailo se zjistit velikost: %1 %2 +ErrorFileHash1=Nepodailo se urit kontroln souet souboru: %1 +ErrorFileHash2=Neplatn kontroln souet souboru: oekvno %1, nalezeno %2 +ErrorProgress=Neplatn prbh: %1 of %2 +ErrorFileSize=Neplatn velikost souboru: oekvno %1, nalezeno %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Pprava k instalaci +PreparingDesc=Prvodce instalac pipravuje instalaci produktu [name] na V pota. +PreviousInstallNotCompleted=Instalace/odinstalace pedchozho produktu nebyla zcela dokonena. Aby mohla bt dokonena, muste restartovat V pota.%n%nPo restartovn Vaeho potae spuste znovu prvodce instalac, aby bylo mon dokonit instalaci produktu [name]. +CannotContinue=Prvodce instalac neme pokraovat. Ukonete prosm prvodce instalac klepnutm na tlatko Zruit. +ApplicationsFound=Nsledujc aplikace pistupuj k souborm, kter je teba bhem instalace aktualizovat. Doporuuje se povolit prvodci instalac, aby tyto aplikace automaticky zavel. +ApplicationsFound2=Nsledujc aplikace pistupuj k souborm, kter je teba bhem instalace aktualizovat. Doporuuje se povolit prvodci instalac, aby tyto aplikace automaticky zavel. Po dokonen instalace se prvodce instalac pokus aplikace restartovat. +CloseApplications=&Zavt aplikace automaticky +DontCloseApplications=&Nezavrat aplikace +ErrorCloseApplications=Prvodci instalac se nepodailo automaticky zavt vechny aplikace. Dve ne budete pokraovat, doporuuje se zavt veker aplikace pistupujc k souborm, kter je teba bhem instalace aktualizovat. +PrepareToInstallNeedsRestart=Prvodce instalac mus restartovat V pota. Po restartovn Vaeho potae spuste prvodce instalac znovu, aby bylo mon dokonit instalaci produktu [name].%n%nChcete jej restartovat nyn? + +; *** "Installing" wizard page +WizardInstalling=Instalovn +InstallingLabel=ekejte prosm, dokud prvodce instalac nedokon instalaci produktu [name] na V pota. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Dokonuje se instalace produktu [name] +FinishedLabelNoIcons=Prvodce instalac dokonil instalaci produktu [name] na V pota. +FinishedLabel=Prvodce instalac dokonil instalaci produktu [name] na V pota. Produkt lze spustit pomoc nainstalovanch zstupc. +ClickFinish=Ukonete prvodce instalac klepnutm na tlatko Dokonit. +FinishedRestartLabel=K dokonen instalace produktu [name] je nezbytn, aby prvodce instalac restartoval V pota. Chcete jej restartovat nyn? +FinishedRestartMessage=K dokonen instalace produktu [name] je nezbytn, aby prvodce instalac restartoval V pota.%n%nChcete jej restartovat nyn? +ShowReadmeCheck=Ano, chci zobrazit dokument "TIMNE" +YesRadio=&Ano, chci nyn restartovat pota +NoRadio=&Ne, pota restartuji pozdji +; used for example as 'Run MyProg.exe' +RunEntryExec=Spustit %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Zobrazit %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Prvodce instalac vyaduje dal disk +SelectDiskLabel2=Vlote prosm disk %1 a klepnte na tlatko OK.%n%nPokud se soubory na tomto disku nachzej v jin sloce ne v t, kter je zobrazena ne, pak zadejte sprvnou cestu nebo ji zvolte klepnutm na tlatko Prochzet. +PathLabel=&Cesta: +FileNotInDir2=Soubor "%1" nelze najt v "%2". Vlote prosm sprvn disk nebo zvolte jinou sloku. +SelectDirectoryLabel=Specifikujte prosm umstn dalho disku. + +; *** Installation phase messages +SetupAborted=Instalace nebyla zcela dokonena.%n%nOpravte prosm chybu a spuste prvodce instalac znovu. +AbortRetryIgnoreSelectAction=Zvolte akci +AbortRetryIgnoreRetry=&Zopakovat akci +AbortRetryIgnoreIgnore=&Ignorovat chybu a pokraovat +AbortRetryIgnoreCancel=Zruit instalaci + +; *** Installation status messages +StatusClosingApplications=Zavraj se aplikace... +StatusCreateDirs=Vytvej se sloky... +StatusExtractFiles=Extrahuj se soubory... +StatusCreateIcons=Vytvej se zstupci... +StatusCreateIniEntries=Vytvej se zznamy v inicializanch souborech... +StatusCreateRegistryEntries=Vytvej se zznamy v systmovm registru... +StatusRegisterFiles=Registruj se soubory... +StatusSavingUninstall=Ukldaj se informace pro odinstalaci produktu... +StatusRunProgram=Dokonuje se instalace... +StatusRestartingApplications=Restartuj se aplikace... +StatusRollback=Proveden zmny se vracej zpt... + +; *** Misc. errors +ErrorInternal2=Intern chyba: %1 +ErrorFunctionFailedNoCode=Funkce %1 selhala +ErrorFunctionFailed=Funkce %1 selhala; kd %2 +ErrorFunctionFailedWithMessage=Funkce %1 selhala; kd %2.%n%3 +ErrorExecutingProgram=Nelze spustit soubor:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Dolo k chyb pi otevrn kle systmovho registru:%n%1\%2 +ErrorRegCreateKey=Dolo k chyb pi vytven kle systmovho registru:%n%1\%2 +ErrorRegWriteKey=Dolo k chyb pi zpisu do kle systmovho registru:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Dolo k chyb pi vytven zznamu v inicializanm souboru "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Peskoit tento soubor (nedoporuuje se) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorovat chybu a pokraovat (nedoporuuje se) +SourceIsCorrupted=Zdrojov soubor je pokozen +SourceDoesntExist=Zdrojov soubor "%1" neexistuje +ExistingFileReadOnly2=Nelze nahradit existujc soubor, protoe je uren pouze pro ten. +ExistingFileReadOnlyRetry=&Odstranit atribut "pouze pro ten" a zopakovat akci +ExistingFileReadOnlyKeepExisting=&Ponechat existujc soubor +ErrorReadingExistingDest=Dolo k chyb pi pokusu o ten existujcho souboru: +FileExistsSelectAction=Zvolte akci +FileExists2=Soubor ji existuje. +FileExistsOverwriteExisting=&Nahradit existujc soubor +FileExistsKeepExisting=&Ponechat existujc soubor +FileExistsOverwriteOrKeepAll=&Zachovat se stejn u dalch konflikt +ExistingFileNewerSelectAction=Zvolte akci +ExistingFileNewer2=Existujc soubor je novj ne ten, kter se prvodce instalac pokou instalovat. +ExistingFileNewerOverwriteExisting=&Nahradit existujc soubor +ExistingFileNewerKeepExisting=&Ponechat existujc soubor (doporuuje se) +ExistingFileNewerOverwriteOrKeepAll=&Zachovat se stejn u dalch konflikt +ErrorChangingAttr=Dolo k chyb pi pokusu o zmnu atribut existujcho souboru: +ErrorCreatingTemp=Dolo k chyb pi pokusu o vytvoen souboru v clov sloce: +ErrorReadingSource=Dolo k chyb pi pokusu o ten zdrojovho souboru: +ErrorCopying=Dolo k chyb pi pokusu o zkoprovn souboru: +ErrorReplacingExistingFile=Dolo k chyb pi pokusu o nahrazen existujcho souboru: +ErrorRestartReplace=Funkce "RestartReplace" prvodce instalac selhala: +ErrorRenamingTemp=Dolo k chyb pi pokusu o pejmenovn souboru v clov sloce: +ErrorRegisterServer=Nelze zaregistrovat DLL/OCX: %1 +ErrorRegSvr32Failed=Voln RegSvr32 selhalo s nvratovm kdem %1 +ErrorRegisterTypeLib=Nelze zaregistrovat typovou knihovnu: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32bitov +UninstallDisplayNameMark64Bit=64bitov +UninstallDisplayNameMarkAllUsers=Vichni uivatel +UninstallDisplayNameMarkCurrentUser=Aktuln uivatel + +; *** Post-installation errors +ErrorOpeningReadme=Dolo k chyb pi pokusu o oteven dokumentu "TIMNE". +ErrorRestartingComputer=Prvodci instalac se nepodailo restartovat V pota. Restartujte jej prosm run. + +; *** Uninstaller messages +UninstallNotFound=Soubor "%1" neexistuje. Produkt nelze odinstalovat. +UninstallOpenError=Soubor "%1" nelze otevt. Produkt nelze odinstalovat. +UninstallUnsupportedVer=Formt souboru se zznamy k odinstalaci produktu "%1" nebyl touto verz prvodce odinstalac rozpoznn. Produkt nelze odinstalovat +UninstallUnknownEntry=V souboru obsahujcm informace k odinstalaci produktu byla zjitna neznm poloka (%1) +ConfirmUninstall=Urit chcete produkt %1 a vechny jeho sousti odinstalovat? +UninstallOnlyOnWin64=Tento produkt lze odinstalovat pouze v 64-bitovch verzch MS Windows. +OnlyAdminCanUninstall=K odinstalaci tohoto produktu muste bt pihleni s oprvnnmi sprvce. +UninstallStatusLabel=ekejte prosm, dokud produkt %1 nebude odinstalovn z Vaeho potae. +UninstalledAll=Produkt %1 byl z Vaeho potae spn odinstalovn. +UninstalledMost=Produkt %1 byl odinstalovn.%n%nNkter jeho sousti se odinstalovat nepodailo. Mete je vak odstranit run. +UninstalledAndNeedsRestart=K dokonen odinstalace produktu %1 je nezbytn, aby prvodce odinstalac restartoval V pota.%n%nChcete jej restartovat nyn? +UninstallDataCorrupted=Soubor "%1" je pokozen. Produkt nelze odinstalovat + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Odebrat sdlen soubor? +ConfirmDeleteSharedFile2=Systm indikuje, e nsledujc sdlen soubor nen pouvn dnmi jinmi aplikacemi. M bt tento sdlen soubor prvodcem odinstalac odstrann?%n%nPokud nkter aplikace tento soubor pouvaj, pak po jeho odstrann nemusej pracovat sprvn. Pokud si nejste jisti, zvolte Ne. Ponechn tohoto souboru ve Vaem systmu nezpsob dnou kodu. +SharedFileNameLabel=Nzev souboru: +SharedFileLocationLabel=Umstn: +WizardUninstalling=Stav odinstalace +StatusUninstalling=Probh odinstalace produktu %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Probh instalace produktu %1. +ShutdownBlockReasonUninstallingApp=Probh odinstalace produktu %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 verze %2 +AdditionalIcons=Dal zstupci: +CreateDesktopIcon=Vytvoit zstupce na &ploe +CreateQuickLaunchIcon=Vytvoit zstupce na panelu &Snadn sputn +ProgramOnTheWeb=Aplikace %1 na internetu +UninstallProgram=Odinstalovat aplikaci %1 +LaunchProgram=Spustit aplikaci %1 +AssocFileExtension=Vytvoit &asociaci mezi soubory typu %2 a aplikac %1 +AssocingFileExtension=Vytv se asociace mezi soubory typu %2 a aplikac %1... +AutoStartProgramGroupDescription=Po sputn: +AutoStartProgram=Spoutt aplikaci %1 automaticky +AddonHostProgramNotFound=Aplikace %1 nebyla ve Vmi zvolen sloce nalezena.%n%nChcete pesto pokraovat? diff --git a/installer/innosetup/Languages/Danish.isl b/installer/innosetup/Languages/Danish.isl new file mode 100644 index 000000000..3939de267 --- /dev/null +++ b/installer/innosetup/Languages/Danish.isl @@ -0,0 +1,379 @@ +; *** Inno Setup version 6.1.0+ Danish messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; ID: Danish.isl,v 6.0.3+ 2020/07/26 Thomas Vedel, thomas@veco.dk +; Parts by scootergrisen, 2015 + +[LangOptions] +LanguageName=Dansk +LanguageID=$0406 +LanguageCodePage=1252 + +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] +; *** Application titles +SetupAppTitle=Installationsguide +SetupWindowTitle=Installationsguide - %1 +UninstallAppTitle=Afinstallr +UninstallAppFullTitle=Afinstallerer %1 + +; *** Misc. common +InformationTitle=Information +ConfirmTitle=Bekrft +ErrorTitle=Fejl + +; *** SetupLdr messages +SetupLdrStartupMessage=Denne guide installerer %1. Vil du fortstte? +LdrCannotCreateTemp=Kan ikke oprette en midlertidig fil. Installationen afbrydes +LdrCannotExecTemp=Kan ikke kre et program i den midlertidige mappe. Installationen afbrydes +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nFejl %2: %3 +SetupFileMissing=Filen %1 mangler i installationsmappen. Ret venligst problemet eller f en ny kopi af programmet. +SetupFileCorrupt=Installationsfilerne er beskadiget. F venligst en ny kopi af installationsprogrammet. +SetupFileCorruptOrWrongVer=Installationsfilerne er beskadiget, eller ogs er de ikke kompatible med denne version af installationsprogrammet. Ret venligst problemet eller f en ny kopi af installationsprogrammet. +InvalidParameter=En ugyldig parameter blev angivet p kommandolinjen:%n%n%1 +SetupAlreadyRunning=Installationsprogrammet krer allerede. +WindowsVersionNotSupported=Programmet understtter ikke den version af Windows, som denne computer krer. +WindowsServicePackRequired=Programmet krver %1 med Service Pack %2 eller senere. +NotOnThisPlatform=Programmet kan ikke anvendes p %1. +OnlyOnThisPlatform=Programmet kan kun anvendes p %1. +OnlyOnTheseArchitectures=Programmet kan kun installeres p versioner af Windows der anvender disse processor-arkitekturer:%n%n%1 +WinVersionTooLowError=Programmet krver %1 version %2 eller senere. +WinVersionTooHighError=Programmet kan ikke installeres p %1 version %2 eller senere. +AdminPrivilegesRequired=Du skal vre logget p som administrator imens programmet installeres. +PowerUserPrivilegesRequired=Du skal vre logget p som administrator eller vre medlem af gruppen Superbrugere imens programmet installeres. +SetupAppRunningError=Installationsprogrammet har registreret at %1 krer.%n%nLuk venligst alle forekomster af programmet, og klik s OK for at fortstte, eller Annuller for at afbryde. +UninstallAppRunningError=Afinstallationsprogrammet har registreret at %1 krer.%n%nLuk venligst alle forekomster af programmet, og klik s OK for at fortstte, eller Annuller for at afbryde. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Vlg guidens installationsmde +PrivilegesRequiredOverrideInstruction=Vlg installationsmde +PrivilegesRequiredOverrideText1=%1 kan installeres for alle brugere (krver administrator-rettigheder), eller for dig alene. +PrivilegesRequiredOverrideText2=%1 kan installeres for dig alene, eller for alle brugere p computeren (sidstnvnte krver administrator-rettigheder). +PrivilegesRequiredOverrideAllUsers=Installer for &alle brugere +PrivilegesRequiredOverrideAllUsersRecommended=Installer for &alle brugere (anbefales) +PrivilegesRequiredOverrideCurrentUser=Installer for &mig alene +PrivilegesRequiredOverrideCurrentUserRecommended=Installer for &mig alene (anbefales) + +; *** Misc. errors +ErrorCreatingDir=Installationsprogrammet kan ikke oprette mappen "%1" +ErrorTooManyFilesInDir=Kan ikke oprette en fil i mappen "%1". Mappen indeholder for mange filer + +; *** Setup common messages +ExitSetupTitle=Afbryd installationen +ExitSetupMessage=Installationen er ikke fuldfrt. Programmet installeres ikke, hvis du afbryder nu.%n%nDu kan kre installationsprogrammet igen p et andet tidspunkt for at udfre installationen.%n%nSkal installationen afbrydes? +AboutSetupMenuItem=&Om installationsprogrammet... +AboutSetupTitle=Om installationsprogrammet +AboutSetupMessage=%1 version %2%n%3%n%n%1 hjemmeside:%n%4 +AboutSetupNote= +TranslatorNote=Danish translation maintained by Thomas Vedel (thomas@veco.dk). Parts by scootergrisen. + +; *** Buttons +ButtonBack=< &Tilbage +ButtonNext=N&ste > +ButtonInstall=&Installer +ButtonOK=&OK +ButtonCancel=&Annuller +ButtonYes=&Ja +ButtonYesToAll=Ja til a&lle +ButtonNo=&Nej +ButtonNoToAll=Nej t&il alle +ButtonFinish=&Frdig +ButtonBrowse=&Gennemse... +ButtonWizardBrowse=G&ennemse... +ButtonNewFolder=&Opret ny mappe + +; *** "Select Language" dialog messages +SelectLanguageTitle=Vlg installationssprog +SelectLanguageLabel=Vlg det sprog der skal vises under installationen. + +; *** Common wizard text +ClickNext=Klik p Nste for at fortstte, eller Annuller for at afbryde installationen. +BeveledLabel= +BrowseDialogTitle=Vlg mappe +BrowseDialogLabel=Vlg en mappe fra nedenstende liste og klik p OK. +NewFolderName=Ny mappe + +; *** "Welcome" wizard page +WelcomeLabel1=Velkommen til installationsguiden for [name] +WelcomeLabel2=Guiden installerer [name/ver] p computeren.%n%nDet anbefales at lukke alle andre programmer inden du fortstter. + +; *** "Password" wizard page +WizardPassword=Adgangskode +PasswordLabel1=Installationen er beskyttet med adgangskode. +PasswordLabel3=Indtast venligst adgangskoden og klik p Nste for at fortstte. Der skelnes mellem store og sm bogstaver. +PasswordEditLabel=&Adgangskode: +IncorrectPassword=Den indtastede kode er forkert. Prv venligst igen. + +; *** "License Agreement" wizard page +WizardLicense=Licensaftale +LicenseLabel=Ls venligst flgende vigtige oplysninger inden du fortstter. +LicenseLabel3=Ls venligst licensaftalen. Du skal acceptere betingelserne i aftalen for at fortstte installationen. +LicenseAccepted=Jeg &accepterer aftalen +LicenseNotAccepted=Jeg accepterer &ikke aftalen + +; *** "Information" wizard pages +WizardInfoBefore=Information +InfoBeforeLabel=Ls venligst flgende information inden du fortstter. +InfoBeforeClickLabel=Klik p Nste, nr du er klar til at fortstte installationen. +WizardInfoAfter=Information +InfoAfterLabel=Ls venligst flgende information inden du fortstter. +InfoAfterClickLabel=Klik p Nste, nr du er klar til at fortstte installationen. + +; *** "User Information" wizard page +WizardUserInfo=Brugerinformation +UserInfoDesc=Indtast venligst dine oplysninger. +UserInfoName=&Brugernavn: +UserInfoOrg=&Organisation: +UserInfoSerial=&Serienummer: +UserInfoNameRequired=Du skal indtaste et navn. + +; *** "Select Destination Directory" wizard page +WizardSelectDir=Vlg installationsmappe +SelectDirDesc=Hvor skal [name] installeres? +SelectDirLabel3=Installationsprogrammet installerer [name] i flgende mappe. +SelectDirBrowseLabel=Klik p Nste for at fortstte. Klik p Gennemse, hvis du vil vlge en anden mappe. +DiskSpaceGBLabel=Der skal vre mindst [gb] GB fri diskplads. +DiskSpaceMBLabel=Der skal vre mindst [mb] MB fri diskplads. +CannotInstallToNetworkDrive=Guiden kan ikke installere programmet p et netvrksdrev. +CannotInstallToUNCPath=Guiden kan ikke installere programmet til en UNC-sti. +InvalidPath=Du skal indtaste en komplet sti med drevbogstav, f.eks.:%n%nC:\Program%n%neller et UNC-stinavn i formatet:%n%n\\server\share +InvalidDrive=Drevet eller UNC-stien du valgte findes ikke, eller der er ikke adgang til det lige nu. Vlg venligst en anden placering. +DiskSpaceWarningTitle=Ikke nok ledig diskplads. +DiskSpaceWarning=Guiden krver mindst %1 KB ledig diskplads for at kunne installere programmet, men det valgte drev har kun %2 KB ledig diskplads.%n%nVil du alligevel fortstte installationen? +DirNameTooLong=Navnet p mappen eller stien er for langt. +InvalidDirName=Navnet p mappen er ikke tilladt. +BadDirName32=Mappenavne m ikke indeholde flgende tegn:%n%n%1 +DirExistsTitle=Mappen findes +DirExists=Mappen:%n%n%1%n%nfindes allerede. Vil du alligevel installere i denne mappe? +DirDoesntExistTitle=Mappen findes ikke. +DirDoesntExist=Mappen:%n%n%1%n%nfindes ikke. Vil du oprette mappen? + +; *** "Select Components" wizard page +WizardSelectComponents=Vlg Komponenter +SelectComponentsDesc=Hvilke komponenter skal installeres? +SelectComponentsLabel2=Vlg de komponenter der skal installeres, og fjern markering fra dem der ikke skal installeres. Klik s p Nste for at fortstte. +FullInstallation=Fuld installation +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakt installation +CustomInstallation=Tilpasset installation +NoUninstallWarningTitle=Komponenterne er installeret +NoUninstallWarning=Installationsprogrammet har registreret at flgende komponenter allerede er installeret p computeren:%n%n%1%n%nKomponenterne bliver ikke afinstalleret hvis de fravlges.%n%nFortst alligevel? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=De nuvrende valg krver mindst [gb] GB ledig diskplads. +ComponentsDiskSpaceMBLabel=De nuvrende valg krver mindst [mb] MB ledig diskplads. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Vlg supplerende opgaver +SelectTasksDesc=Hvilke supplerende opgaver skal udfres? +SelectTasksLabel2=Vlg de supplerende opgaver du vil have guiden til at udfre under installationen af [name] og klik p Nste. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Vlg mappe i menuen Start +SelectStartMenuFolderDesc=Hvor skal installationsprogrammet oprette genveje til programmet? +SelectStartMenuFolderLabel3=Installationsprogrammet opretter genveje til programmet i flgende mappe i menuen Start. +SelectStartMenuFolderBrowseLabel=Klik p Nste for at fortstte. Klik p Gennemse, hvis du vil vlge en anden mappe. +MustEnterGroupName=Du skal indtaste et mappenavn. +GroupNameTooLong=Mappens eller stiens navn er for langt. +InvalidGroupName=Mappenavnet er ugyldigt. +BadGroupName=Navnet p en programgruppe m ikke indeholde flgende tegn: %1. Angiv andet navn. +NoProgramGroupCheck2=Opret &ingen programgruppe i menuen Start + +; *** "Ready to Install" wizard page +WizardReady=Klar til at installere +ReadyLabel1=Installationsprogrammet er nu klar til at installere [name] p computeren. +ReadyLabel2a=Klik p Installer for at fortstte med installationen, eller klik p Tilbage hvis du vil se eller ndre indstillingerne. +ReadyLabel2b=Klik p Installer for at fortstte med installationen. +ReadyMemoUserInfo=Brugerinformation: +ReadyMemoDir=Installationsmappe: +ReadyMemoType=Installationstype: +ReadyMemoComponents=Valgte komponenter: +ReadyMemoGroup=Mappe i menuen Start: +ReadyMemoTasks=Valgte supplerende opgaver: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Downloader yderligere filer... +ButtonStopDownload=&Stop download +StopDownload=Er du sikker p at du nsker at afbryde download? +ErrorDownloadAborted=Download afbrudt +ErrorDownloadFailed=Fejl under download: %1 %2 +ErrorDownloadSizeFailed=Fejl ved lsning af filstrrelse: %1 %2 +ErrorFileHash1=Fejl i hash: %1 +ErrorFileHash2=Fejl i fil hash vrdi: forventet %1, fundet %2 +ErrorProgress=Fejl i trin: %1 af %2 +ErrorFileSize=Fejl i filstrrelse: forventet %1, fundet %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Klargring af installationen +PreparingDesc=Installationsprogrammet gr klar til at installere [name] p din computer. +PreviousInstallNotCompleted=Installation eller afinstallation af et program er ikke afsluttet. Du skal genstarte computeren for at afslutte den foregende installation.%n%nNr computeren er genstartet skal du kre installationsprogrammet til [name] igen. +CannotContinue=Installationsprogrammet kan ikke fortstte. Klik venligst p Fortryd for at afslutte. +ApplicationsFound=Flgende programmer bruger filer som skal opdateres. Det anbefales at du giver installationsprogrammet tilladelse til automatisk at lukke programmerne. +ApplicationsFound2=Flgende programmer bruger filer som skal opdateres. Det anbefales at du giver installationsprogrammet tilladelse til automatisk at lukke programmerne. Installationsguiden vil forsge at genstarte programmerne nr installationen er fuldfrt. +CloseApplications=&Luk programmerne automatisk +DontCloseApplications=Luk &ikke programmerne +ErrorCloseApplications=Installationsprogrammet kunne ikke lukke alle programmerne automatisk. Det anbefales at du lukker alle programmer som bruger filer der skal opdateres, inden installationsprogrammet fortstter. +PrepareToInstallNeedsRestart=Installationsprogrammet er ndt til at genstarte computeren. Efter genstarten skal du kre installationsprogrammet igen for at frdiggre installation af [name].%n%nVil du at genstarte nu? + +; *** "Installing" wizard page +WizardInstalling=Installerer +InstallingLabel=Vent venligst mens installationsprogrammet installerer [name] p computeren. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Fuldfrer installation af [name] +FinishedLabelNoIcons=Installationsguiden har fuldfrt installation af [name] p computeren. +FinishedLabel=Installationsguiden har fuldfrt installation af [name] p computeren. Programmet kan startes ved at vlge de oprettede ikoner. +ClickFinish=Klik p Frdig for at afslutte installationsprogrammet. +FinishedRestartLabel=Computeren skal genstartes for at fuldfre installation af [name]. Vil du genstarte computeren nu? +FinishedRestartMessage=Computeren skal genstartes for at fuldfre installation af [name].%n%nVil du genstarte computeren nu? +ShowReadmeCheck=Ja, jeg vil gerne se README-filen +YesRadio=&Ja, genstart computeren nu +NoRadio=&Nej, jeg genstarter computeren senere +; used for example as 'Run MyProg.exe' +RunEntryExec=Kr %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Vis %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Installationsprogrammet skal bruge den nste disk +SelectDiskLabel2=Indst disk %1 og klik p OK.%n%nHvis filerne findes i en anden mappe end den viste, s indtast stien eller klik Gennemse. +PathLabel=&Sti: +FileNotInDir2=Filen "%1" blev ikke fundet i "%2". Indst venligst den korrekte disk, eller vlg en anden mappe. +SelectDirectoryLabel=Angiv venligst placeringen af den nste disk. + +; *** Installation phase messages +SetupAborted=Installationen blev ikke fuldfrt.%n%nRet venligst de fundne problemer og kr installationsprogrammet igen. +AbortRetryIgnoreSelectAction=Vlg nsket handling +AbortRetryIgnoreRetry=&Forsg igen +AbortRetryIgnoreIgnore=&Ignorer fejlen og fortst +AbortRetryIgnoreCancel=Afbryd installationen + +; *** Installation status messages +StatusClosingApplications=Lukker programmer... +StatusCreateDirs=Opretter mapper... +StatusExtractFiles=Udpakker filer... +StatusCreateIcons=Opretter genveje... +StatusCreateIniEntries=Opretter poster i INI-filer... +StatusCreateRegistryEntries=Opretter poster i registreringsdatabasen... +StatusRegisterFiles=Registrerer filer... +StatusSavingUninstall=Gemmer information om afinstallation... +StatusRunProgram=Fuldfrer installation... +StatusRestartingApplications=Genstarter programmer... +StatusRollback=Fjerner ndringer... + +; *** Misc. errors +ErrorInternal2=Intern fejl: %1 +ErrorFunctionFailedNoCode=%1 fejlede +ErrorFunctionFailed=%1 fejlede; kode %2 +ErrorFunctionFailedWithMessage=%1 fejlede; kode %2.%n%3 +ErrorExecutingProgram=Kan ikke kre programfilen:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Fejl ved bning af ngle i registreringsdatabase:%n%1\%2 +ErrorRegCreateKey=Fejl ved oprettelse af ngle i registreringsdatabase:%n%1\%2 +ErrorRegWriteKey=Fejl ved skrivning til ngle i registreringsdatabase:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Fejl ved oprettelse af post i INI-filen "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Spring over denne fil (anbefales ikke) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorer fejlen og fortst (anbefales ikke) +SourceIsCorrupted=Kildefilen er beskadiget +SourceDoesntExist=Kildefilen "%1" findes ikke +ExistingFileReadOnly2=Den eksisterende fil er skrivebeskyttet og kan derfor ikke overskrives. +ExistingFileReadOnlyRetry=&Fjern skrivebeskyttelsen og forsg igen +ExistingFileReadOnlyKeepExisting=&Behold den eksisterende fil +ErrorReadingExistingDest=Der opstod en fejl ved lsning af den eksisterende fil: +FileExistsSelectAction=Vlg handling +FileExists2=Filen findes allerede. +FileExistsOverwriteExisting=&Overskriv den eksisterende fil +FileExistsKeepExisting=&Behold den eksiterende fil +FileExistsOverwriteOrKeepAll=&Gentag handlingen for de nste konflikter +ExistingFileNewerSelectAction=Vlg handling +ExistingFileNewer2=Den eksisterende fil er nyere end den som forsges installeret. +ExistingFileNewerOverwriteExisting=&Overskriv den eksisterende fil +ExistingFileNewerKeepExisting=&Behold den eksisterende fil (anbefales) +ExistingFileNewerOverwriteOrKeepAll=&Gentag handlingen for de nste konflikter +ErrorChangingAttr=Der opstod en fejl ved ndring af attributter for den eksisterende fil: +ErrorCreatingTemp=Der opstod en fejl ved oprettelse af en fil i mappen: +ErrorReadingSource=Der opstod en fejl ved lsning af kildefilen: +ErrorCopying=Der opstod en fejl ved kopiering af en fil: +ErrorReplacingExistingFile=Der opstod en fejl ved forsg p at erstatte den eksisterende fil: +ErrorRestartReplace=Erstatning af fil ved genstart mislykkedes: +ErrorRenamingTemp=Der opstod en fejl ved forsg p at omdbe en fil i installationsmappen: +ErrorRegisterServer=Kan ikke registrere DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 fejlede med exit kode %1 +ErrorRegisterTypeLib=Kan ikke registrere typebiblioteket: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Alle brugere +UninstallDisplayNameMarkCurrentUser=Nuvrende bruger + +; *** Post-installation errors +ErrorOpeningReadme=Der opstod en fejl ved forsg p at bne README-filen. +ErrorRestartingComputer=Installationsprogrammet kunne ikke genstarte computeren. Genstart venligst computeren manuelt. + +; *** Uninstaller messages +UninstallNotFound=Filen "%1" findes ikke. Kan ikke afinstalleres. +UninstallOpenError=Filen "%1" kunne ikke bnes. Kan ikke afinstalleres +UninstallUnsupportedVer=Afinstallations-logfilen "%1" er i et format der ikke genkendes af denne version af afinstallations-guiden. Afinstallationen afbrydes +UninstallUnknownEntry=Der er en ukendt post (%1) i afinstallerings-logfilen. +ConfirmUninstall=Er du sikker p at du vil fjerne %1 og alle tilhrende komponenter? +UninstallOnlyOnWin64=Denne installation kan kun afinstalleres p 64-bit Windows-versioner +OnlyAdminCanUninstall=Programmet kan kun afinstalleres af en bruger med administratorrettigheder. +UninstallStatusLabel=Vent venligst imens %1 afinstalleres fra computeren. +UninstalledAll=%1 er nu fjernet fra computeren. +UninstalledMost=%1 afinstallation er fuldfrt.%n%nNogle elementer kunne ikke fjernes. De kan fjernes manuelt. +UninstalledAndNeedsRestart=Computeren skal genstartes for at fuldfre afinstallation af %1.%n%nVil du genstarte nu? +UninstallDataCorrupted=Filen "%1" er beskadiget. Kan ikke afinstallere + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Fjern delt fil? +ConfirmDeleteSharedFile2=Systemet indikerer at flgende delte fil ikke lngere er i brug. Skal den/de delte fil(er) fjernes af guiden?%n%nHvis du er usikker s vlg Nej. Beholdes filen p maskinen, vil den ikke gre nogen skade, men hvis filen fjernes, selv om den stadig anvendes, bliver de programmer, der anvender filen, ustabile +SharedFileNameLabel=Filnavn: +SharedFileLocationLabel=Placering: +WizardUninstalling=Status for afinstallation +StatusUninstalling=Afinstallerer %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installerer %1. +ShutdownBlockReasonUninstallingApp=Afinstallerer %1. + +[CustomMessages] +NameAndVersion=%1 version %2 +AdditionalIcons=Supplerende ikoner: +CreateDesktopIcon=Opret ikon p skrive&bordet +CreateQuickLaunchIcon=Opret &hurtigstart-ikon +ProgramOnTheWeb=%1 p internettet +UninstallProgram=Afinstaller (fjern) %1 +LaunchProgram=&Start %1 +AssocFileExtension=Sammen&kd %1 med filtypen %2 +AssocingFileExtension=Sammenkder %1 med filtypen %2... +AutoStartProgramGroupDescription=Start: +AutoStartProgram=Start automatisk %1 +AddonHostProgramNotFound=%1 blev ikke fundet i den valgte mappe.%n%nVil du alligevel fortstte? diff --git a/installer/innosetup/Languages/Dutch.isl b/installer/innosetup/Languages/Dutch.isl new file mode 100644 index 000000000..761528b2a --- /dev/null +++ b/installer/innosetup/Languages/Dutch.isl @@ -0,0 +1,359 @@ +; *** Inno Setup version 6.1.0+ Dutch messages *** +; +; This file is based on user-contributed translations by various authors +; +; Maintained by Martijn Laan (mlaan@jrsoftware.org) + +[LangOptions] +LanguageName=Nederlands +LanguageID=$0413 +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Setup +SetupWindowTitle=Setup - %1 +UninstallAppTitle=Verwijderen +UninstallAppFullTitle=%1 verwijderen + +; *** Misc. common +InformationTitle=Informatie +ConfirmTitle=Bevestigen +ErrorTitle=Fout + +; *** SetupLdr messages +SetupLdrStartupMessage=Hiermee wordt %1 geïnstalleerd. Wilt u doorgaan? +LdrCannotCreateTemp=Kan geen tijdelijk bestand maken. Setup wordt afgesloten +LdrCannotExecTemp=Kan een bestand in de tijdelijke map niet uitvoeren. Setup wordt afgesloten + +; *** Startup error messages +LastErrorMessage=%1.%n%nFout %2: %3 +SetupFileMissing=Het bestand %1 ontbreekt in de installatiemap. Corrigeer dit probleem of gebruik een andere kopie van het programma. +SetupFileCorrupt=De installatiebestanden zijn beschadigd. Gebruik een andere kopie van het programma. +SetupFileCorruptOrWrongVer=De installatiebestanden zijn beschadigd, of zijn niet compatibel met deze versie van Setup. Corrigeer dit probleem of gebruik een andere kopie van het programma. +InvalidParameter=Er werd een ongeldige schakeloptie opgegeven op de opdrachtregel:%n%n%1 +SetupAlreadyRunning=Setup is al gestart. +WindowsVersionNotSupported=Dit programma ondersteunt de versie van Windows die u gebruikt niet. +WindowsServicePackRequired=Dit programma vereist %1 Service Pack %2 of hoger. +NotOnThisPlatform=Dit programma kan niet worden uitgevoerd onder %1. +OnlyOnThisPlatform=Dit programma moet worden uitgevoerd onder %1. +OnlyOnTheseArchitectures=Dit programma kan alleen geïnstalleerd worden onder versies van Windows ontworpen voor de volgende processor architecturen:%n%n%1 +WinVersionTooLowError=Dit programma vereist %1 versie %2 of hoger. +WinVersionTooHighError=Dit programma kan niet worden geïnstalleerd onder %1 versie %2 of hoger. +AdminPrivilegesRequired=U moet aangemeld zijn als een systeembeheerder om dit programma te kunnen installeren. +PowerUserPrivilegesRequired=U moet ingelogd zijn als systeembeheerder of als gebruiker met systeembeheerders rechten om dit programma te kunnen installeren. +SetupAppRunningError=Setup heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters hiervan, en klik daarna op OK om verder te gaan, of op Annuleren om Setup af te sluiten. +UninstallAppRunningError=Het verwijderprogramma heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters hiervan, en klik daarna op OK om verder te gaan, of op Annuleren om het verwijderen af te breken. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Selecteer installatie modus voor Setup +PrivilegesRequiredOverrideInstruction=Selecteer installatie modus +PrivilegesRequiredOverrideText1=%1 kan geïnstalleerd worden voor alle gebruikers (vereist aanmelding als een systeembeheerder), of voor u alleen. +PrivilegesRequiredOverrideText2=%1 kan geïnstalleerd worden voor u alleen, of voor alle gebruikers (vereist aanmelding als een systeembeheerder). +PrivilegesRequiredOverrideAllUsers=Installeer voor &alle gebruikers +PrivilegesRequiredOverrideAllUsersRecommended=Installeer voor &alle gebruikers (aanbevolen) +PrivilegesRequiredOverrideCurrentUser=Installeer voor &mij alleen +PrivilegesRequiredOverrideCurrentUserRecommended=Installeer voor &mij alleen (aanbevolen) + +; *** Misc. errors +ErrorCreatingDir=Setup kan de map "%1" niet maken +ErrorTooManyFilesInDir=Kan geen bestand maken in de map "%1" omdat deze te veel bestanden bevat + +; *** Setup common messages +ExitSetupTitle=Setup afsluiten +ExitSetupMessage=Setup is niet voltooid. Als u nu afsluit, wordt het programma niet geïnstalleerd.%n%nU kunt Setup later opnieuw uitvoeren om de installatie te voltooien.%n%nSetup afsluiten? +AboutSetupMenuItem=&Over Setup... +AboutSetupTitle=Over Setup +AboutSetupMessage=%1 versie %2%n%3%n%n%1-homepage:%n%4 +AboutSetupNote= +TranslatorNote=Dutch translation maintained by Martijn Laan (mlaan@jrsoftware.org) + +; *** Buttons +ButtonBack=< Vo&rige +ButtonNext=&Volgende > +ButtonInstall=&Installeren +ButtonOK=OK +ButtonCancel=Annuleren +ButtonYes=&Ja +ButtonYesToAll=Ja op &alles +ButtonNo=&Nee +ButtonNoToAll=N&ee op alles +ButtonFinish=&Voltooien +ButtonBrowse=&Bladeren... +ButtonWizardBrowse=B&laderen... +ButtonNewFolder=&Nieuwe map maken + +; *** "Select Language" dialog messages +SelectLanguageTitle=Selecteer taal voor Setup +SelectLanguageLabel=Selecteer de taal die Setup gebruikt tijdens de installatie. + +; *** Common wizard text +ClickNext=Klik op Volgende om verder te gaan of op Annuleren om Setup af te sluiten. +BeveledLabel= +BrowseDialogTitle=Map Selecteren +BrowseDialogLabel=Selecteer een map in onderstaande lijst en klik daarna op OK. +NewFolderName=Nieuwe map + +; *** "Welcome" wizard page +WelcomeLabel1=Welkom bij het installatieprogramma van [name]. +WelcomeLabel2=Hiermee wordt [name/ver] geïnstalleerd op deze computer.%n%nU wordt aanbevolen alle actieve programma's af te sluiten voordat u verder gaat. + +; *** "Password" wizard page +WizardPassword=Wachtwoord +PasswordLabel1=Deze installatie is beveiligd met een wachtwoord. +PasswordLabel3=Voer het wachtwoord in en klik op Volgende om verder te gaan. Wachtwoorden zijn hoofdlettergevoelig. +PasswordEditLabel=&Wachtwoord: +IncorrectPassword=Het ingevoerde wachtwoord is niet correct. Probeer het opnieuw. + +; *** "License Agreement" wizard page +WizardLicense=Licentieovereenkomst +LicenseLabel=Lees de volgende belangrijke informatie voordat u verder gaat. +LicenseLabel3=Lees de volgende licentieovereenkomst. Gebruik de schuifbalk of druk op de knop Page Down om de rest van de overeenkomst te zien. +LicenseAccepted=Ik &accepteer de licentieovereenkomst +LicenseNotAccepted=Ik accepteer de licentieovereenkomst &niet + +; *** "Information" wizard pages +WizardInfoBefore=Informatie +InfoBeforeLabel=Lees de volgende belangrijke informatie voordat u verder gaat. +InfoBeforeClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. +WizardInfoAfter=Informatie +InfoAfterLabel=Lees de volgende belangrijke informatie voordat u verder gaat. +InfoAfterClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. + +; *** "User Information" wizard page +WizardUserInfo=Gebruikersinformatie +UserInfoDesc=Vul hier uw informatie in. +UserInfoName=&Gebruikersnaam: +UserInfoOrg=&Organisatie: +UserInfoSerial=&Serienummer: +UserInfoNameRequired=U moet een naam invullen. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Kies de doelmap +SelectDirDesc=Waar moet [name] geïnstalleerd worden? +SelectDirLabel3=Setup zal [name] in de volgende map installeren. +SelectDirBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. +DiskSpaceGBLabel=Er is ten minste [gb] GB vrije schijfruimte vereist. +DiskSpaceMBLabel=Er is ten minste [mb] MB vrije schijfruimte vereist. +CannotInstallToNetworkDrive=Setup kan niet installeren naar een netwerkstation. +CannotInstallToUNCPath=Setup kan niet installeren naar een UNC-pad. +InvalidPath=U moet een volledig pad met stationsletter invoeren; bijvoorbeeld:%nC:\APP%n%nof een UNC-pad zoals:%n%n\\server\share +InvalidDrive=Het geselecteerde station bestaat niet. Kies een ander station. +DiskSpaceWarningTitle=Onvoldoende schijfruimte +DiskSpaceWarning=Setup vereist ten minste %1 kB vrije schijfruimte voor het installeren, maar het geselecteerde station heeft slechts %2 kB beschikbaar.%n%nWilt u toch doorgaan? +DirNameTooLong=De mapnaam of het pad is te lang. +InvalidDirName=De mapnaam is ongeldig. +BadDirName32=Mapnamen mogen geen van de volgende tekens bevatten:%n%n%1 +DirExistsTitle=Map bestaat al +DirExists=De map:%n%n%1%n%nbestaat al. Wilt u toch naar die map installeren? +DirDoesntExistTitle=Map bestaat niet +DirDoesntExist=De map:%n%n%1%n%nbestaat niet. Wilt u de map aanmaken? + +; *** "Select Components" wizard page +WizardSelectComponents=Selecteer componenten +SelectComponentsDesc=Welke componenten moeten geïnstalleerd worden? +SelectComponentsLabel2=Selecteer de componenten die u wilt installeren. Klik op Volgende als u klaar bent om verder te gaan. +FullInstallation=Volledige installatie +CompactInstallation=Compacte installatie +CustomInstallation=Aangepaste installatie +NoUninstallWarningTitle=Component bestaat +NoUninstallWarning=Setup heeft gedetecteerd dat de volgende componenten al geïnstalleerd zijn op uw computer:%n%n%1%n%nAls u de selectie van deze componenten ongedaan maakt, worden ze niet verwijderd.%n%nWilt u toch doorgaan? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=De huidige selectie vereist ten minste [gb] GB vrije schijfruimte. +ComponentsDiskSpaceMBLabel=De huidige selectie vereist ten minste [mb] MB vrije schijfruimte. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Selecteer extra taken +SelectTasksDesc=Welke extra taken moeten uitgevoerd worden? +SelectTasksLabel2=Selecteer de extra taken die u door Setup wilt laten uitvoeren bij het installeren van [name], en klik vervolgens op Volgende. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Selecteer menu Start map +SelectStartMenuFolderDesc=Waar moeten de snelkoppelingen van het programma geplaatst worden? +SelectStartMenuFolderLabel3=Setup plaatst de snelkoppelingen van het programma in de volgende menu Start map. +SelectStartMenuFolderBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. +MustEnterGroupName=U moet een mapnaam invoeren. +GroupNameTooLong=De mapnaam of het pad is te lang. +InvalidGroupName=De mapnaam is ongeldig. +BadGroupName=De mapnaam mag geen van de volgende tekens bevatten:%n%n%1 +NoProgramGroupCheck2=&Geen menu Start map maken + +; *** "Ready to Install" wizard page +WizardReady=Het voorbereiden van de installatie is gereed +ReadyLabel1=Setup is nu gereed om te beginnen met het installeren van [name] op deze computer. +ReadyLabel2a=Klik op Installeren om verder te gaan met installeren, of klik op Vorige als u instellingen wilt terugzien of veranderen. +ReadyLabel2b=Klik op Installeren om verder te gaan met installeren. +ReadyMemoUserInfo=Gebruikersinformatie: +ReadyMemoDir=Doelmap: +ReadyMemoType=Installatietype: +ReadyMemoComponents=Geselecteerde componenten: +ReadyMemoGroup=Menu Start map: +ReadyMemoTasks=Extra taken: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Bezig met het downloaden van extra bestanden... +ButtonStopDownload=&Stop download +StopDownload=Weet u zeker dat u de download wilt stoppen? +ErrorDownloadAborted=Download afgebroken +ErrorDownloadFailed=Download mislukt: %1 %2 +ErrorDownloadSizeFailed=Ophalen grootte mislukt: %1 %2 +ErrorFileHash1=Bestand hashing mislukt: %1 +ErrorFileHash2=Ongeldige bestandshash: %1 verwacht, %2 gevonden +ErrorProgress=Ongeldige voortgang: %1 van %2 +ErrorFileSize=Ongeldige bestandsgrootte: %1 verwacht, %2 gevonden + +; *** "Preparing to Install" wizard page +WizardPreparing=Bezig met het voorbereiden van de installatie +PreparingDesc=Setup is bezig met het voorbereiden van de installatie van [name]. +PreviousInstallNotCompleted=De installatie/verwijdering van een vorig programma is niet voltooid. U moet uw computer opnieuw opstarten om die installatie te voltooien.%n%nStart Setup nogmaals nadat uw computer opnieuw is opgestart om de installatie van [name] te voltooien. +CannotContinue=Setup kan niet doorgaan. Klik op annuleren om af te sluiten. +ApplicationsFound=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. +ApplicationsFound2=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. Nadat de installatie is voltooid zal Setup proberen de applicaties opnieuw op te starten. +CloseApplications=&Programma's automatisch afsluiten +DontCloseApplications=Programma's &niet afsluiten +ErrorCloseApplications=Setup kon niet alle programma's automatisch afsluiten. U wordt aanbevolen alle programma's die bestanden gebruiken die moeten worden bijgewerkt door Setup af te sluiten voordat u verder gaat. +PrepareToInstallNeedsRestart=Setup moet uw computer opnieuw opstarten. Start Setup nogmaals nadat uw computer opnieuw is opgestart om de installatie van [name] te voltooien.%n%nWilt u nu opnieuw opstarten? + +; *** "Installing" wizard page +WizardInstalling=Bezig met installeren +InstallingLabel=Setup installeert [name] op uw computer. Een ogenblik geduld... + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Setup heeft het installeren van [name] op deze computer voltooid. +FinishedLabelNoIcons=Setup heeft het installeren van [name] op deze computer voltooid. +FinishedLabel=Setup heeft het installeren van [name] op deze computer voltooid. U kunt het programma uitvoeren met de geïnstalleerde snelkoppelingen. +ClickFinish=Klik op Voltooien om Setup te beëindigen. +FinishedRestartLabel=Setup moet de computer opnieuw opstarten om de installatie van [name] te voltooien. Wilt u nu opnieuw opstarten? +FinishedRestartMessage=Setup moet uw computer opnieuw opstarten om de installatie van [name] te voltooien.%n%nWilt u nu opnieuw opstarten? +ShowReadmeCheck=Ja, ik wil het bestand Leesmij zien +YesRadio=&Ja, start de computer nu opnieuw op +NoRadio=&Nee, ik start de computer later opnieuw op +RunEntryExec=Start %1 +RunEntryShellExec=Bekijk %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Setup heeft de volgende diskette nodig +SelectDiskLabel2=Voer diskette %1 in en klik op OK.%n%nAls de bestanden op deze diskette in een andere map gevonden kunnen worden dan die hieronder wordt getoond, voer dan het juiste pad in of klik op Bladeren. +PathLabel=&Pad: +FileNotInDir2=Kan het bestand "%1" niet vinden in "%2". Voer de juiste diskette in of kies een andere map. +SelectDirectoryLabel=Geef de locatie van de volgende diskette. + +; *** Installation phase messages +SetupAborted=Setup is niet voltooid.%n%nCorrigeer het probleem en voer Setup opnieuw uit. +AbortRetryIgnoreSelectAction=Selecteer actie +AbortRetryIgnoreRetry=&Probeer opnieuw +AbortRetryIgnoreIgnore=&Negeer de fout en ga door +AbortRetryIgnoreCancel=Breek installatie af + +; *** Installation status messages +StatusClosingApplications=Programma's afsluiten... +StatusCreateDirs=Mappen maken... +StatusExtractFiles=Bestanden uitpakken... +StatusCreateIcons=Snelkoppelingen maken... +StatusCreateIniEntries=INI-gegevens instellen... +StatusCreateRegistryEntries=Registergegevens instellen... +StatusRegisterFiles=Bestanden registreren... +StatusSavingUninstall=Verwijderingsinformatie opslaan... +StatusRunProgram=Installatie voltooien... +StatusRestartingApplications=Programma's opnieuw starten... +StatusRollback=Veranderingen ongedaan maken... + +; *** Misc. errors +ErrorInternal2=Interne fout: %1 +ErrorFunctionFailedNoCode=%1 mislukt +ErrorFunctionFailed=%1 mislukt; code %2 +ErrorFunctionFailedWithMessage=%1 mislukt; code %2.%n%3 +ErrorExecutingProgram=Kan bestand niet uitvoeren:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Fout bij het openen van registersleutel:%n%1\%2 +ErrorRegCreateKey=Fout bij het maken van registersleutel:%n%1\%2 +ErrorRegWriteKey=Fout bij het schrijven naar registersleutel:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Fout bij het maken van een INI-instelling in bestand "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Sla dit bestand over (niet aanbevolen) +FileAbortRetryIgnoreIgnoreNotRecommended=&Negeer de fout en ga door (niet aanbevolen) +SourceIsCorrupted=Het bronbestand is beschadigd +SourceDoesntExist=Het bronbestand "%1" bestaat niet +ExistingFileReadOnly2=Het bestaande bestand kon niet vervangen worden omdat het een alleen-lezen markering heeft. +ExistingFileReadOnlyRetry=&Verwijder de alleen-lezen markering en probeer het opnieuw +ExistingFileReadOnlyKeepExisting=&Behoud het bestaande bestand +ErrorReadingExistingDest=Er is een fout opgetreden bij het lezen van het bestaande bestand: +FileExistsSelectAction=Selecteer actie +FileExists2=Het bestand bestaat al. +FileExistsOverwriteExisting=&Overschrijf het bestaande bestand +FileExistsKeepExisting=&Behoud het bestaande bestand +FileExistsOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren +ExistingFileNewerSelectAction=Selecteer actie +ExistingFileNewer2=Het bestaande bestand is nieuwer dan het bestand dat Setup probeert te installeren. +ExistingFileNewerOverwriteExisting=&Overschrijf het bestaande bestand +ExistingFileNewerKeepExisting=&Behoud het bestaande bestand (aanbevolen) +ExistingFileNewerOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren +ErrorChangingAttr=Er is een fout opgetreden bij het wijzigen van de kenmerken van het bestaande bestand: +ErrorCreatingTemp=Er is een fout opgetreden bij het maken van een bestand in de doelmap: +ErrorReadingSource=Er is een fout opgetreden bij het lezen van het bronbestand: +ErrorCopying=Er is een fout opgetreden bij het kopiëren van een bestand: +ErrorReplacingExistingFile=Er is een fout opgetreden bij het vervangen van het bestaande bestand: +ErrorRestartReplace=Vervangen na opnieuw starten is mislukt: +ErrorRenamingTemp=Er is een fout opgetreden bij het hernoemen van een bestand in de doelmap: +ErrorRegisterServer=Kan de DLL/OCX niet registreren: %1 +ErrorRegSvr32Failed=RegSvr32 mislukt met afsluitcode %1 +ErrorRegisterTypeLib=Kan de type library niet registreren: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Alle gebruikers +UninstallDisplayNameMarkCurrentUser=Huidige gebruiker + +; *** Post-installation errors +ErrorOpeningReadme=Er is een fout opgetreden bij het openen van het Leesmij-bestand. +ErrorRestartingComputer=Setup kan de computer niet opnieuw opstarten. Doe dit handmatig. + +; *** Uninstaller messages +UninstallNotFound=Bestand "%1" bestaat niet. Kan het programma niet verwijderen. +UninstallUnsupportedVer=Het installatie-logbestand "%1" heeft een formaat dat niet herkend wordt door deze versie van het verwijderprogramma. Kan het programma niet verwijderen +UninstallUnknownEntry=Er is een onbekend gegeven (%1) aangetroffen in het installatie-logbestand +ConfirmUninstall=Weet u zeker dat u %1 en alle bijbehorende componenten wilt verwijderen? +UninstallOnlyOnWin64=Deze installatie kan alleen worden verwijderd onder 64-bit Windows. +OnlyAdminCanUninstall=Deze installatie kan alleen worden verwijderd door een gebruiker met administratieve rechten. +UninstallStatusLabel=%1 wordt verwijderd van uw computer. Een ogenblik geduld. +UninstallOpenError=Bestand "%1" kon niet worden geopend. Kan het verwijderen niet voltooien. +UninstalledAll=%1 is met succes van deze computer verwijderd. +UninstalledMost=Het verwijderen van %1 is voltooid.%n%nEnkele elementen konden niet verwijderd worden. Deze kunnen handmatig verwijderd worden. +UninstalledAndNeedsRestart=Om het verwijderen van %1 te voltooien, moet uw computer opnieuw worden opgestart.%n%nWilt u nu opnieuw opstarten? +UninstallDataCorrupted="%1" bestand is beschadigd. Kan verwijderen niet voltooien + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Gedeeld bestand verwijderen? +ConfirmDeleteSharedFile2=Het systeem geeft aan dat het volgende gedeelde bestand niet langer gebruikt wordt door enig programma. Wilt u dat dit gedeelde bestand verwijderd wordt?%n%nAls dit bestand toch nog gebruikt wordt door een programma en het verwijderd wordt, werkt dat programma misschien niet meer correct. Als u het niet zeker weet, kies dan Nee. Bewaren van het bestand op dit systeem is niet schadelijk. +SharedFileNameLabel=Bestandsnaam: +SharedFileLocationLabel=Locatie: +WizardUninstalling=Verwijderingsstatus +StatusUninstalling=Verwijderen van %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installeren van %1. +ShutdownBlockReasonUninstallingApp=Verwijderen van %1. + +[CustomMessages] + +NameAndVersion=%1 versie %2 +AdditionalIcons=Extra snelkoppelingen: +CreateDesktopIcon=Maak een snelkoppeling op het &bureaublad +CreateQuickLaunchIcon=Maak een snelkoppeling op de &Snel starten werkbalk +ProgramOnTheWeb=%1 op het Web +UninstallProgram=Verwijder %1 +LaunchProgram=&Start %1 +AssocFileExtension=&Koppel %1 aan de %2 bestandsextensie +AssocingFileExtension=Bezig met koppelen van %1 aan de %2 bestandsextensie... +AutoStartProgramGroupDescription=Opstarten: +AutoStartProgram=%1 automatisch starten +AddonHostProgramNotFound=%1 kon niet worden gevonden in de geselecteerde map.%n%nWilt u toch doorgaan? diff --git a/installer/innosetup/Languages/EnglishBritish.isl b/installer/innosetup/Languages/EnglishBritish.isl index 309c560ae..60a941064 100644 --- a/installer/innosetup/Languages/EnglishBritish.isl +++ b/installer/innosetup/Languages/EnglishBritish.isl @@ -1,6 +1,7 @@ -; *** Inno Setup version 5.5.3+ English (British) messages *** +; *** Inno Setup version 6.1.0+ English (British) messages *** ; ; Translated by Boris Kotov +; Translation updated by Andrew Truckle [LangOptions] ; The following three entries are very important. Be sure to read and @@ -49,7 +50,6 @@ WindowsServicePackRequired=This program requires %1 Service Pack %2 or later. NotOnThisPlatform=This program will not run on %1. OnlyOnThisPlatform=This program must be run on %1. OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 -MissingWOW64APIs=The version of Windows you are running does not include functionality required by Setup to perform a 64-bit installation. To correct this problem, please install Service Pack %1. WinVersionTooLowError=This program requires %1 version %2 or later. WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. @@ -57,6 +57,16 @@ PowerUserPrivilegesRequired=You must be logged in as an administrator or as a me SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. +; *** Startup questions +PrivilegesRequiredOverrideTitle=Select Setup Install Mode +PrivilegesRequiredOverrideInstruction=Select install mode +PrivilegesRequiredOverrideText1=%1 can be installed for all users (requires administrative privileges), or for you only. +PrivilegesRequiredOverrideText2=%1 can be installed for you only, or for all users (requires administrative privileges). +PrivilegesRequiredOverrideAllUsers=Install for &all users +PrivilegesRequiredOverrideAllUsersRecommended=Install for &all users (recommended) +PrivilegesRequiredOverrideCurrentUser=Install for &me only +PrivilegesRequiredOverrideCurrentUserRecommended=Install for &me only (recommended) + ; *** Misc. errors ErrorCreatingDir=Setup was unable to create the directory "%1" ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files @@ -135,6 +145,7 @@ WizardSelectDir=Select Destination Location SelectDirDesc=Where should [name] be installed? SelectDirLabel3=Setup will install [name] into the following folder. SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. +DiskSpaceGBLabel=At least [gb] GB of free disk space is required. DiskSpaceMBLabel=At least [mb] MB of free disk space is required. CannotInstallToNetworkDrive=Setup cannot install to a network drive. CannotInstallToUNCPath=Setup cannot install to a UNC path. @@ -162,6 +173,7 @@ NoUninstallWarningTitle=Components Exist NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? ComponentSize1=%1 KB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Current selection requires at least [gb] GB of disk space. ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. ; *** "Select Additional Tasks" wizard page @@ -192,6 +204,18 @@ ReadyMemoComponents=Selected components: ReadyMemoGroup=Start Menu folder: ReadyMemoTasks=Additional tasks: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Downloading additional files... +ButtonStopDownload=&Stop download +StopDownload=Are you sure you want to stop the download? +ErrorDownloadAborted=Download aborted +ErrorDownloadFailed=Download failed: %1 %2 +ErrorDownloadSizeFailed=Getting size failed: %1 %2 +ErrorFileHash1=File hash failed: %1 +ErrorFileHash2=Invalid file hash: expected %1, found %2 +ErrorProgress=Invalid progress: %1 of %2 +ErrorFileSize=Invalid file size: expected %1, found %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Preparing to Install PreparingDesc=Setup is preparing to install [name] on your computer. @@ -202,6 +226,7 @@ ApplicationsFound2=The following applications are using files that need to be up CloseApplications=&Automatically close the applications DontCloseApplications=&Do not close the applications ErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing. +PrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now? ; *** "Installing" wizard page WizardInstalling=Installing @@ -231,7 +256,10 @@ SelectDirectoryLabel=Please specify the location of the next disk. ; *** Installation phase messages SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. -EntryAbortRetryIgnore=Click Retry to try again, Ignore to proceed anyway, or Abort to cancel installation. +AbortRetryIgnoreSelectAction=Select action +AbortRetryIgnoreRetry=&Try again +AbortRetryIgnoreIgnore=&Ignore the error and continue +AbortRetryIgnoreCancel=Cancel installation ; *** Installation status messages StatusClosingApplications=Closing applications... @@ -262,14 +290,24 @@ ErrorRegWriteKey=Error writing to registry key:%n%1\%2 ErrorIniEntry=Error creating INI entry in file "%1". ; *** File copying errors -FileAbortRetryIgnore=Click Retry to try again, Ignore to skip this file (not recommended), or Abort to cancel installation. -FileAbortRetryIgnore2=Click Retry to try again, Ignore to proceed anyway (not recommended), or Abort to cancel installation. +FileAbortRetryIgnoreSkipNotRecommended=&Skip this file (not recommended) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignore the error and continue (not recommended) SourceIsCorrupted=The source file is corrupted SourceDoesntExist=The source file "%1" does not exist -ExistingFileReadOnly=The existing file is marked as read-only.%n%nClick Retry to remove the read-only attribute and try again, Ignore to skip this file, or Abort to cancel installation. +ExistingFileReadOnly2=The existing file could not be replaced because it is marked read-only. +ExistingFileReadOnlyRetry=&Remove the read-only attribute and try again +ExistingFileReadOnlyKeepExisting=&Keep the existing file ErrorReadingExistingDest=An error occurred while trying to read the existing file: -FileExists=The file already exists.%n%nWould you like Setup to overwrite it? -ExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file? +FileExistsSelectAction=Select action +FileExists2=The file already exists. +FileExistsOverwriteExisting=&Overwrite the existing file +FileExistsKeepExisting=&Keep the existing file +FileExistsOverwriteOrKeepAll=&Do this for the next conflicts +ExistingFileNewerSelectAction=Select action +ExistingFileNewer2=The existing file is newer than the one Setup is trying to install. +ExistingFileNewerOverwriteExisting=&Overwrite the existing file +ExistingFileNewerKeepExisting=&Keep the existing file (recommended) +ExistingFileNewerOverwriteOrKeepAll=&Do this for the next conflicts ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: ErrorReadingSource=An error occurred while trying to read the source file: @@ -281,6 +319,16 @@ ErrorRegisterServer=Unable to register the DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 ErrorRegisterTypeLib=Unable to register the type library: %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=All users +UninstallDisplayNameMarkCurrentUser=Current user + ; *** Post-installation errors ErrorOpeningReadme=An error occurred while trying to open the README file. ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. diff --git a/installer/innosetup/Languages/Esperanto.isl b/installer/innosetup/Languages/Esperanto.isl index 5896c824c..ec0c1c4e8 100644 --- a/installer/innosetup/Languages/Esperanto.isl +++ b/installer/innosetup/Languages/Esperanto.isl @@ -1,12 +1,14 @@ -; *** Inno Setup version 5.5.3+ Esperanto messages *** -; -; Author: Alexander Gritchin (E-mail - alexgrimo@mail.ru) +; Inno Setup version 6.1.0+ Esperanto messages *** ; -; Au`toro: Alexander Gritc`in (E-mail - alexgrimo@mail.ru) -; Versio del traduko - 15.06.08 +; Aŭtoro: Alexander Gritĉin +; Retpoŝto: alexgrimo@mail.ru +; Traduko: 15.06.2008 ; -; +; Aŭtoro: Wolfgang Pohl +; Retpoŝto: software@interpohl.net) +; Traduko: 15.04.2021 ; + ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in @@ -16,8 +18,8 @@ ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=Esperanto -LanguageID=$0 -LanguageCodePage=0 +LanguageID=$1000 +LanguageCodePage=28593 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= @@ -29,15 +31,13 @@ LanguageCodePage=0 ;CopyrightFontName=Arial ;CopyrightFontSize=8 - - [Messages] ; *** Application titles SetupAppTitle=Instalado SetupWindowTitle=Instalado de - %1 UninstallAppTitle=Forigado -UninstallAppFullTitle=Forigado de %1 +UninstallAppFullTitle=Forigado de %1 ; *** Misc. common InformationTitle=Informacio @@ -45,53 +45,63 @@ ConfirmTitle=Konfirmado ErrorTitle=Eraro ; *** SetupLdr messages -SetupLdrStartupMessage=Nun estos instalado de %1. C`u vi volas kontinui? -LdrCannotCreateTemp=Nepoveble estas krei tempan dosieron. La Majstro estas s`topita -LdrCannotExecTemp=Nepoveble estas plenumi la dosieron en tempa dosierujo. La Majstro estas s`topita +SetupLdrStartupMessage=Nun estos instalado de %1. Ĉu vi volas kontinui? +LdrCannotCreateTemp=Nepoveble estas krei tempan dosieron. La Majstro estas ŝtopita +LdrCannotExecTemp=Nepoveble estas plenumi la dosieron en tempa dosierujo. La Majstro estas ŝtopita +HelpTextNote= ; *** Startup error messages LastErrorMessage=%1.%n%nEraro %2: %3 -SetupFileMissing=La dosiero %1 estas preterpasita el instala dosierujo.Bonvolu korekti problemon au` ricevu novan kopion de programo. +SetupFileMissing=La dosiero %1 estas preterpasita el instala dosierujo.Bonvolu korekti problemon aŭ ricevu novan kopion de programo. SetupFileCorrupt=Instalaj dosieroj estas kriplitaj. Bonvolu ricevu novan kopion de programo. -SetupFileCorruptOrWrongVer=Instalaj dosieroj estas kriplitaj, au` ne komparablaj kun tia versio del Majstro. Bonvolu korekti problemon au` ricevu novan kopion de programo. -InvalidParameter=Malg`usta parametro estis en komandlinio:%n%n%1 +SetupFileCorruptOrWrongVer=Instalaj dosieroj estas kriplitaj, aŭ ne komparablaj kun tia versio del Majstro. Bonvolu korekti problemon aŭ ricevu novan kopion de programo. +InvalidParameter=Malĝusta parametro estis en komandlinio:%n%n%1 SetupAlreadyRunning=La Majstro jam funkcias. -WindowsVersionNotSupported=C`i tia programo ne povas subteni la version de Vindoso en via komputilo. -WindowsServicePackRequired=Por c`i tia programo bezonas %1 Service Pack %2 au` pli olda. -NotOnThisPlatform=C`i tia programo ne funkcios en %1. -OnlyOnThisPlatform=C`i tia programo devas funkcii en %1. -OnlyOnTheseArchitectures=C`i tia programo nur povas esti instalita en version de Vindoso por sekvaj procesoraj arkitekturoj:%n%n%1 -MissingWOW64APIs=La versio de Vindoso kian vi lanc`is, ne havas posedon bezonatan por ke Majstro plenumis 64-bit instaladon. Por korekti tian problemon bonvolu instali Service Pack %1. -WinVersionTooLowError=Por c`i tia programo bezonas %1 version %2 au` pli olda. -WinVersionTooHighError=C`i tia programo ne povas esti instalita en %1 versio %2 au` pli olda. -AdminPrivilegesRequired=Vi devas eniri kiel administranto kiam instalas c`i tian programon. -PowerUserPrivilegesRequired=Vi devas eniri kiel administranto au` kiel membro de grupo de Posedaj Uzantoj kiam instalas c`i tia programo. -SetupAppRunningError=La Majstro difinis ke %1 nun funkcias.%n%nBonvolu s`topi g`in, kaj poste kliku Jes por kontinui, au` S`topi por eliri. -UninstallAppRunningError=Forigados difinis ke %1 nun funkcias.%n%nBonvolu s`topi g`in, kaj poste kliku Jes por kontinui, au` S`topi por eliri. +WindowsVersionNotSupported=Ĉi tia programo ne povas subteni la version de Vindoso en via komputilo. +WindowsServicePackRequired=Por ĉi tia programo bezonas %1 Service Pack %2 aŭ pli olda. +NotOnThisPlatform=Ĉi tia programo ne funkcios en %1. +OnlyOnThisPlatform=Ĉi tia programo devas funkcii en %1. +OnlyOnTheseArchitectures=Ĉi tia programo nur povas esti instalita en version de Vindoso por sekvaj procesoraj arkitekturoj:%n%n%1 +WinVersionTooLowError=Por ĉi tia programo bezonas %1 version %2 aŭ pli olda. +WinVersionTooHighError=Ĉi tia programo ne povas esti instalita en %1 versio %2 aŭ pli olda. +AdminPrivilegesRequired=Vi devas eniri kiel administranto kiam instalas ĉi tian programon. +PowerUserPrivilegesRequired=Vi devas eniri kiel administranto aŭ kiel membro de grupo de Posedaj Uzantoj kiam instalas ĉi tia programo. +SetupAppRunningError=La Majstro difinis ke %1 nun funkcias.%n%nBonvolu ŝtopi ĝin, kaj poste kliku Jes por kontinui, aŭ Ŝtopi por eliri. +UninstallAppRunningError=Forigados difinis ke %1 nun funkcias.%n%nBonvolu ŝtopi ĝin, kaj poste kliku Jes por kontinui, aŭ Ŝtopi por eliri. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Elektu Instala Reĝimo +PrivilegesRequiredOverrideInstruction=Elektu instala reĝimo +PrivilegesRequiredOverrideText1=%1 povas esti instalita por ĉiuj uzantoj (postulas administrajn privilegiojn), aŭ nur por vi. +PrivilegesRequiredOverrideText2=%1 povas esti instalita nur por vi aŭ por ĉiuj uzantoj (postulas administrajn privilegiojn). +PrivilegesRequiredOverrideAllUsers=Instali por ĉiuj &uzantoj +PrivilegesRequiredOverrideAllUsersRecommended=Instali por ĉiuj &uzantoj (rekomendita) +PrivilegesRequiredOverrideCurrentUser=Instali nur por &mi +PrivilegesRequiredOverrideCurrentUserRecommended=Instali nur por &mi (rekomendita) ; *** Misc. errors ErrorCreatingDir=La Majstro ne povas krei dosierujon "%1" -ErrorTooManyFilesInDir=Estas nepoveble krei dosieron en dosierujo "%1" pro tio ke g`i havas tro multe da dosierojn +ErrorTooManyFilesInDir=Estas nepoveble krei dosieron en dosierujo "%1" pro tio ke ĝi havas tro multe da dosierojn ; *** Setup common messages -ExitSetupTitle=S`topo Majstron -ExitSetupMessage=La instalado ne estas plena. Se vi eliros nun, la programo ne estos instalita.%n%nPor vi bezonas s`alti Majstron denove en alia tempo por plenumi instaladon.%n%nC`u fini la Majstron? +ExitSetupTitle=Ŝtopo Majstron +ExitSetupMessage=La instalado ne estas plena. Se vi eliros nun, la programo ne estos instalita.%n%nPor vi bezonas ŝalti Majstron denove en alia tempo por plenumi instaladon.%n%nĈu fini la Majstron? AboutSetupMenuItem=&Pri instalo... AboutSetupTitle=Pri instalo -AboutSetupMessage=%1 version %2%n%3%n%n%1 hejma pag`o:%n%4 +AboutSetupMessage=%1 version %2%n%3%n%n%1 hejma paĝo:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Reen -ButtonNext=&Antau`en > +ButtonNext=&Antaŭen > ButtonInstall=&Instali ButtonOK=Jes -ButtonCancel=S`topi +ButtonCancel=Ŝtopi ButtonYes=&Jes -ButtonYesToAll=Jes por &c`iaj +ButtonYesToAll=Jes por &ĉiaj ButtonNo=&Ne -ButtonNoToAll=Ne por c`iaj +ButtonNoToAll=Ne por ĉiaj ButtonFinish=&Fino ButtonBrowse=&Elekto... ButtonWizardBrowse=Elekto... @@ -102,40 +112,40 @@ SelectLanguageTitle=Elektu la lingvon SelectLanguageLabel=Elektu la lingvon por uzo dum instalado: ; *** Common wizard text -ClickNext=Kliku Antau`en por kontinui, au` S`topi por eliri Instaladon. +ClickNext=Kliku Antaŭen por kontinui, aŭ Ŝtopi por eliri Instaladon. BeveledLabel= BrowseDialogTitle=Elekto de dosierujo BrowseDialogLabel=Elektu la dosierujon en listo malalte, kaj kliku Jes. NewFolderName=Nova dosierujo ; *** "Welcome" wizard page -WelcomeLabel1=Bonvenon al Majstro de instalado de [name] -WelcomeLabel2=Nun komencos instalado de [name/ver] en via komputilo.%n%nEstas rekomendite ke vi s`topu c`iajn viajn programojn antau` komenco. +WelcomeLabel1=Bonvenon al Majstro de instalado de [name] +WelcomeLabel2=Nun komencos instalado de [name/ver] en via komputilo.%n%nEstas rekomendite ke vi ŝtopu ĉiajn viajn programojn antaŭ komenco. ; *** "Password" wizard page WizardPassword=Pasvorto -PasswordLabel1=C`i tia instalado postulas pasvorton. -PasswordLabel3=Bonvolu tajpi pasvorton kaj poste kliku Antau`en por kontinui. La pasvortoj estas tajp sentemaj. +PasswordLabel1=Ĉi tia instalado postulas pasvorton. +PasswordLabel3=Bonvolu tajpi pasvorton kaj poste kliku Antaŭen por kontinui. La pasvortoj estas tajp sentemaj. PasswordEditLabel=&Pasvorto: -IncorrectPassword=La pasvorto, kian vi tajpis estas malg`usta. Bonvolu provi denove. +IncorrectPassword=La pasvorto, kian vi tajpis estas malĝusta. Bonvolu provi denove. ; *** "License Agreement" wizard page WizardLicense=Licenza konvenio -LicenseLabel=Bonvolu legi sekvan gravan informacion antau` komenci. -LicenseLabel3=Bonvolu legi sekvan Licenzan Konvenion. Vi devas akcepti dotaj`oj de tia konvenio antau` ke kontinui instaladon. +LicenseLabel=Bonvolu legi sekvan gravan informacion antaŭ komenci. +LicenseLabel3=Bonvolu legi sekvan Licenzan Konvenion. Vi devas akcepti dotaĵoj de tia konvenio antaŭ ke kontinui instaladon. LicenseAccepted=Mi akceptas konvenion LicenseNotAccepted=Mi ne akceptas konvenion ; *** "Information" wizard pages WizardInfoBefore=Informacio -InfoBeforeLabel=Bonvolu legi sekvan gravan informacion antau` komenci. -InfoBeforeClickLabel=Kiam vi estas preta por kontinui per instalo, kliku Antau`en. +InfoBeforeLabel=Bonvolu legi sekvan gravan informacion antaŭ komenci. +InfoBeforeClickLabel=Kiam vi estas preta por kontinui per instalo, kliku Antaŭen. WizardInfoAfter=Informacio -InfoAfterLabel=Bonvolu legi sekvan gravan informacion antau` komenci. -InfoAfterClickLabel=Kiam vi estas preta por kontinui per instalo, kliku Antau`en. +InfoAfterLabel=Bonvolu legi sekvan gravan informacion antaŭ komenci. +InfoAfterClickLabel=Kiam vi estas preta por kontinui per instalo, kliku Antaŭen. ; *** "User Information" wizard page -WizardUserInfo= Informacio pri uzanto +WizardUserInfo=Informacio pri uzanto UserInfoDesc=Bonvolu skribi vian informacion. UserInfoName=Nomo de uzanto: UserInfoOrg=&Organizacio: @@ -146,56 +156,58 @@ UserInfoNameRequired=Vi devas skribi nomon de uzanto. WizardSelectDir=Elektu Destinan Locon SelectDirDesc=Kie devos [name] esti instalita? SelectDirLabel3=La Majstro instalos [name] en sekvan dosierujon. -SelectDirBrowseLabel=Por kontinui, kliku Antau`en. Se vi volas elekti diversan dosierujon, kliku Elekto. -DiskSpaceMBLabel=Almenau` [mb] MB de neta diska spaco bezonas. +SelectDirBrowseLabel=Por kontinui, kliku Antaŭen. Se vi volas elekti diversan dosierujon, kliku Elekto. +DiskSpaceGBLabel=Almenaŭ [gb] GB de neta diska spaco bezonas. +DiskSpaceMBLabel=Almenaŭ [mb] MB de neta diska spaco bezonas. CannotInstallToNetworkDrive=Majstro ne povas instali lokan diskon. -CannotInstallToUNCPath=Majstro ne povas instali lau` UNC vojo. -InvalidPath=Vi devas skribi plenan vojon de diska litero; por ekzamplo:%n%nC:\APP%n%sed ne UNC vojo lau` formo:%n%n\\server\share -InvalidDrive=Disko au` UNC kian vi elektis ne ekzistas au` ne estas difinita. Bonvolu elekti denove. +CannotInstallToUNCPath=Majstro ne povas instali laŭ UNC vojo. +InvalidPath=Vi devas skribi plenan vojon de diska litero; por ekzamplo:%n%nC:\APP%n%sed ne UNC vojo laŭ formo:%n%n\\server\share +InvalidDrive=Disko aŭ UNC kian vi elektis ne ekzistas aŭ ne estas difinita. Bonvolu elekti denove. DiskSpaceWarningTitle=Mankas Diskan Spacon -DiskSpaceWarning=Por instalo bezonas almenau` %1 KB de neta spaco por instalado, sed electita disko havas nur %2 KB.%n%nC`u vi volas kontinui per c`iokaze? -DirNameTooLong=La nomo de dosierujo au` vojo estas tro longa. -InvalidDirName=La nomo de dosierujo estas malg`usta. +DiskSpaceWarning=Por instalo bezonas almenaŭ %1 KB de neta spaco por instalado, sed electita disko havas nur %2 KB.%n%nĈu vi volas kontinui per ĉiokaze? +DirNameTooLong=La nomo de dosierujo aŭ vojo estas tro longa. +InvalidDirName=La nomo de dosierujo estas malĝusta. BadDirName32=La nomoj de dosierujoj ne povas havi de sekvaj karakteroj:%n%n%1 DirExistsTitle=Dosierujo ekzistas -DirExists=La dosierujo:%n%n%1%n%njam ekzistas. C`u vi volas instali en g`i c`iokaze? +DirExists=La dosierujo:%n%n%1%n%njam ekzistas. Ĉu vi volas instali en ĝi ĉiokaze? DirDoesntExistTitle=La dosierujo ne ekzistas -DirDoesntExist=La dosierujo:%n%n%1%n%nne ekzistas. C`u vi volas por ke tia dosierujo estos farita? +DirDoesntExist=La dosierujo:%n%n%1%n%nne ekzistas. Ĉu vi volas por ke tia dosierujo estos farita? ; *** "Select Components" wizard page WizardSelectComponents=Elektu komponentoj SelectComponentsDesc=Kiaj komponentoj devas esti instalitaj? -SelectComponentsLabel2=Elektu komponentoj kiaj vi volas instali; forigu la komponentojn kiaj vi ne volas instali. Kliku Antau`en kiam vi estas preta por kontinui. +SelectComponentsLabel2=Elektu komponentoj kiaj vi volas instali; forigu la komponentojn kiaj vi ne volas instali. Kliku Antaŭen kiam vi estas preta por kontinui. FullInstallation=Tuta instalado ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Kompakta instalado CustomInstallation=Kutima instalado NoUninstallWarningTitle=Komponentoj ekzistas -NoUninstallWarning=La Majstro difinis ke sekvaj komponentoj jam estas instalitaj en via komputilo:%n%n%1%n%nNuligo de elekto de tiaj komponentoj ne forigos g`in.%n%nC`u vi volas kontinui c`iokaze? +NoUninstallWarning=La Majstro difinis ke sekvaj komponentoj jam estas instalitaj en via komputilo:%n%n%1%n%nNuligo de elekto de tiaj komponentoj ne forigos ĝin.%n%nĈu vi volas kontinui ĉiokaze? ComponentSize1=%1 KB ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=Nuna elekto bezonas almenau` [mb] MB de diska spaco. +ComponentsDiskSpaceGBLabel=Nuna elekto bezonas almenaŭ [gb] GB de diska spaco. +ComponentsDiskSpaceMBLabel=Nuna elekto bezonas almenaŭ [mb] MB de diska spaco. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Elektu aldonaj taskoj SelectTasksDesc=Kiaj aldonaj taskoj devos esti montrotaj? -SelectTasksLabel2=Elektu aldonaj taskoj kiaj bezonas por ke Majstro montros dum instalado [name], kaj poste kliku Antau`en. +SelectTasksLabel2=Elektu aldonaj taskoj kiaj bezonas por ke Majstro montros dum instalado [name], kaj poste kliku Antaŭen. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Elektu dosierujon de starta menuo SelectStartMenuFolderDesc=Kie Majstro devas krei tujklavon de programo? SelectStartMenuFolderLabel3=La Majstro kreos tujklavojn de programo en sekva dosierujo de starta menuo. -SelectStartMenuFolderBrowseLabel=Por kontinui, kliku Antau`en. Se vi volas elekti alian dosierujon, kliku Elekto. -MustEnterGroupName=Vi devas skribi la nomo de dosierujo. -GroupNameTooLong=La nomo de dosierujo au` vojo estas tro longa. -InvalidGroupName=La nomo de dosierujo estas malg`usta. +SelectStartMenuFolderBrowseLabel=Por kontinui, kliku Antaŭen. Se vi volas elekti alian dosierujon, kliku Elekto. +MustEnterGroupName=Vi devas skribi la nomo de dosierujo. +GroupNameTooLong=La nomo de dosierujo aŭ vojo estas tro longa. +InvalidGroupName=La nomo de dosierujo estas malĝusta. BadGroupName=La nomoj de dosierujoj ne povas havi de sekvaj karakteroj:%n%n%1 NoProgramGroupCheck2=Ne krei dosierujon de starta menuo ; *** "Ready to Install" wizard page WizardReady=Preparado por Instalo -ReadyLabel1=Nun c`io estas preparita por komenci instaladon [name] en via komputilo. -ReadyLabel2a=Kliku Instali por kontinui instaladon, au`kliku Reen se vi volas rigardi au` s`ang`i ajnajn statojn. +ReadyLabel1=Nun ĉio estas preparita por komenci instaladon [name] en via komputilo. +ReadyLabel2a=Kliku Instali por kontinui instaladon, aŭkliku Reen se vi volas rigardi aŭ ŝanĝi ajnajn statojn. ReadyLabel2b=Kliku Instali por kontinui instaladon. ReadyMemoUserInfo=Informacio de uzanto: ReadyMemoDir=Destina loko: @@ -204,49 +216,65 @@ ReadyMemoComponents=Elektitaj komponentoj: ReadyMemoGroup=La dosierujo de starta menuo: ReadyMemoTasks=Aldonaj taskoj: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Elŝuti pliajn dosierojn... +ButtonStopDownload=&Stopu elŝuti +StopDownload=Ĉu vi certas, ke vi volas stopi la elŝuton? +ErrorDownloadAborted=Elŝuto ĉesigita +ErrorDownloadFailed=Elŝuto malsukcesis: %1 %2 +ErrorDownloadSizeFailed=Akiri grandecon malsukcesis: %1 %2 +ErrorFileHash1=Dosiero haŝkodo malsukcesis: %1 +ErrorFileHash2=Nevalida dosiero haŝkodo: atendita %1, trovita %2 +ErrorProgress=Nevalida progreso: %1 de %2 +ErrorFileSize=Nevalida dosiergrandeco: atendita %1, trovita %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Preparado por Instalo PreparingDesc=Majstro estas preparata por instalo [name] en via komputilo. -PreviousInstallNotCompleted=Instalado/Forigo de antau`a programo ne estas plena. Por vi bezonas relanc`i vian komputilon por plenigi tian instaladon.%n%nPost relanc`o de via komputilo, s`altu Majstron denove por finigi instaladon de [name]. +PreviousInstallNotCompleted=Instalado/Forigo de antaŭa programo ne estas plena. Por vi bezonas relanĉi vian komputilon por plenigi tian instaladon.%n%nPost relanĉo de via komputilo, ŝaltu Majstron denove por finigi instaladon de [name]. CannotContinue=La Majstro ne povas kontinui. Bonvolu kliki Fino por eliri. -ApplicationsFound=Sekvaj aplikaj`oj uzas dosierojn kiajn bezonas renovigi per Instalado. Estas rekomendite ke vi permesu al Majstro automate fermi tiajn aplikaj`ojn. -ApplicationsFound2=Sekvaj aplikaj`oj uzas dosierojn kiajn bezonas renovigi per Instalado. Estas rekomendite ke vi permesu al Majstro automate fermi tiajn aplikaj`ojn. Poste de instalado Majstro provos relanc`i aplikaj`ojn. -CloseApplications=&Automate fermi aplikaj`ojn -DontCloseApplications=Ne fermu aplikaj`ojn -ErrorCloseApplications=Majstro estis nepovebla au`tomate fermi c`iajn aplikaj`ojn. Estas rekomendite ke vi fermu c`iajn aplikaj`ojn, uzantaj dosierojn, kiaj estas bezonatajn por renovigo per la Majstro antau` kontinui. +ApplicationsFound=Sekvaj aplikaĵoj uzas dosierojn kiajn bezonas renovigi per Instalado. Estas rekomendite ke vi permesu al Majstro automate fermi tiajn aplikaĵojn. +ApplicationsFound2=Sekvaj aplikaĵoj uzas dosierojn kiajn bezonas renovigi per Instalado. Estas rekomendite ke vi permesu al Majstro automate fermi tiajn aplikaĵojn. Poste de instalado Majstro provos relanĉi aplikaĵojn. +CloseApplications=&Automate fermi aplikaĵojn +DontCloseApplications=Ne fermu aplikaĵojn +ErrorCloseApplications=Majstro estis nepovebla aŭtomate fermi ĉiajn aplikaĵojn. Estas rekomendite ke vi fermu ĉiajn aplikaĵojn, uzantaj dosierojn, kiaj estas bezonatajn por renovigo per la Majstro antaŭ kontinui. +PrepareToInstallNeedsRestart=Instalado devas restartigi vian komputilon. Post restartigi vian komputilon, rulu denove Instaladon por kompletigi la instaladon de [name].%n%nĈu vi ŝatus rekomenci nun? ; *** "Installing" wizard page WizardInstalling=Instalado InstallingLabel=Bonvolu atenti dum Majstro instalas [name] en via komputilo. ; *** "Setup Completed" wizard page -FinishedHeadingLabel= Fino de instalado +FinishedHeadingLabel=Fino de instalado FinishedLabelNoIcons=La Majstro finigis instaladon [name] en via komputilo. -FinishedLabel=La Majstro finigis instaladon [name] en via komputilo. La aplikaj`o povos esti lanc`ita per elekto de instalaj ikonoj. -ClickFinish= Kliku Fino por finigi instaladon. -FinishedRestartLabel=Por plenumigi instaladon de [name], Majstro devas relanc`i vian komputilon. C`u vi volas relanc`i nun? -FinishedRestartMessage=Por plenumigi instaladon de [name], Majstro devas relanc`i vian komputilon.%n%nC`u vi volas relanc`i nun? -ShowReadmeCheck=Jes, mi volas rigardi dosieron README -YesRadio=&Jes, relanc`u komputilon nun -NoRadio=&Ne, mi volas relanc`i komputilon poste +FinishedLabel=La Majstro finigis instaladon [name] en via komputilo. La aplikaĵo povos esti lanĉita per elekto de instalaj ikonoj. +ClickFinish=Kliku Fino por finigi instaladon. +FinishedRestartLabel=Por plenumigi instaladon de [name], Majstro devas relanĉi vian komputilon. Ĉu vi volas relanĉi nun? +FinishedRestartMessage=Por plenumigi instaladon de [name], Majstro devas relanĉi vian komputilon.%n%nĈu vi volas relanĉi nun? +ShowReadmeCheck=Jes, mi volas rigardi dosieron README +YesRadio=&Jes, relanĉu komputilon nun +NoRadio=&Ne, mi volas relanĉi komputilon poste ; used for example as 'Run MyProg.exe' -RunEntryExec=S`altu %1 +RunEntryExec=Ŝaltu %1 ; used for example as 'View Readme.txt' RunEntryShellExec=Rigardi %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=La Majstro postulas sekvan diskon -SelectDiskLabel2=Bonvolu inserti Diskon %1 kaj kliku Jes.%n%nSe dosieroj en tia disko povos esti diversaj de prezentitaj malalte, enskribu korektan vojon au` kliku Elekto. +SelectDiskLabel2=Bonvolu inserti Diskon %1 kaj kliku Jes.%n%nSe dosieroj en tia disko povos esti diversaj de prezentitaj malalte, enskribu korektan vojon aŭ kliku Elekto. PathLabel=&Vojo: -FileNotInDir2=Dosieron "%1" estas nepoveble lokigi en "%2". Bonvolu inserti korectan diskon au` elektu alian dosierujon. +FileNotInDir2=Dosieron "%1" estas nepoveble lokigi en "%2". Bonvolu inserti korectan diskon aŭ elektu alian dosierujon. SelectDirectoryLabel=Bonvolu difini lokon de alia disko. ; *** Installation phase messages -SetupAborted=Instalado ne estis plena.%n%nBonvolu korekti problemon kaj lanc`u Majstron denove. -EntryAbortRetryIgnore=Kliku Reen por provi ankorau`, Ignori por fari c`iokaze, au` S`topi por finigi instaladon. +SetupAborted=Instalado ne estis plena.%n%nBonvolu korekti problemon kaj lanĉu Majstron denove. +AbortRetryIgnoreSelectAction=Elektu agon +AbortRetryIgnoreRetry=&Provu denove +AbortRetryIgnoreIgnore=&Ignori la eraron kaj daŭrigi +AbortRetryIgnoreCancel=Nuligi instaladon ; *** Installation status messages -StatusClosingApplications=Fermado de aplikaj`oj... +StatusClosingApplications=Fermado de aplikaĵoj... StatusCreateDirs=Kreado de dosierujojn... StatusExtractFiles=Ekstraktado de dosierojn... StatusCreateIcons=Kreado de tujklavojn... @@ -254,9 +282,9 @@ StatusCreateIniEntries=Kreado de INI dosierojn... StatusCreateRegistryEntries=Kreado de registraj pointoj... StatusRegisterFiles=Registrado de dosierojn... StatusSavingUninstall=Konservas informacio por forigo... -StatusRunProgram=Finig`as instalado... -StatusRestartingApplications=Relanc`o de aplikaj`oj... -StatusRollback=Renovigo de s`ang`oj... +StatusRunProgram=Finiĝas instalado... +StatusRestartingApplications=Relanĉo de aplikaĵoj... +StatusRollback=Renovigo de ŝanĝoj... ; *** Misc. errors ErrorInternal2=Interna eraro: %1 @@ -266,54 +294,75 @@ ErrorFunctionFailedWithMessage=%1 estas kripligita; kodnomo %2.%n%3 ErrorExecutingProgram=Estas nepoveble plenumi dosieron:%n%1 ; *** Registry errors -ErrorRegOpenKey=Eraro dum malfermo de registra s`losilo:%n%1\%2 -ErrorRegCreateKey=Eraro dum kreado de registra s`losilo:%n%1\%2 -ErrorRegWriteKey=Eraro dum skribado en registra s`losilo:%n%1\%2 +ErrorRegOpenKey=Eraro dum malfermo de registra ŝlosilo:%n%1\%2 +ErrorRegCreateKey=Eraro dum kreado de registra ŝlosilo:%n%1\%2 +ErrorRegWriteKey=Eraro dum skribado en registra ŝlosilo:%n%1\%2 ; *** INI errors ErrorIniEntry=Eraro dum kreado de INI pointo en dosiero "%1". ; *** File copying errors -FileAbortRetryIgnore=Kliku Reen por provi denove, Ignori por lasi tian dosieron (ne estas rekomendite), au` S`topi por finigi instaladon. -FileAbortRetryIgnore2=Kliku Reen por provi denove, Ignori por plenumi c`iokaze (ne estas rekomendite), au` S`topi por finigi instaladon. +FileAbortRetryIgnoreSkipNotRecommended=&Preterpasi ĉi tiun dosieron (ne rekomendita) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignori la eraron kaj daŭrigi (ne rekomendita) SourceIsCorrupted=La fonta dosiero estas kripligita SourceDoesntExist=La fonta dosiero "%1" ne ekzistas -ExistingFileReadOnly=Ekzista dosiero estas markita kiel nurlega.%n%nKliku Reen por forigi la nurlegan atributon kaj provu reen, Ignori por lasi tian dosieron, au` S`topi por fini instaladon. +ExistingFileReadOnly=Ekzistanta dosiero estas markita nurlega.%n%nAlklaku Reen por forigi la nurlegeblan atributon kaj provu denove, Ignori por transsalti la dosieron aŭ Ĉesigi por kompletigi la instaladon. +ExistingFileReadOnly2=La ekzistanta dosiero ne povis esti anstataŭigita ĉar ĝi estas markita nurlega. +ExistingFileReadOnlyRetry=&Forigu la nurlegeblan atributon kaj reprovu +ExistingFileReadOnlyKeepExisting=&Konservu la ekzistantan dosieron ErrorReadingExistingDest=Eraro aperis dum legado de ekzista dosiero: -FileExists=La dosiero jam ekzistas.%n%nC`u vi volas ke Majstro reskribu g`in? -ExistingFileNewer=Ekzista dosiero estas pli nova ol Majstro provas instali. Estas rekomendita ke vi konservu ekzistan dosieron.%n%nC`u vi volas konservi ekzistan dosieron? -ErrorChangingAttr=Eraro aperis dum provo c`ang`i atributoj de ekzista dosiero: +FileExistsSelectAction=Elekti agon +FileExists2=La dosiero jam ekzistas. +FileExistsOverwriteExisting=&Anstataŭigu la ekzistantan dosieron +FileExistsKeepExisting=&Konservu la ekzistantan dosieron +FileExistsOverwriteOrKeepAll=&Faru ĉi tion por la venontaj konfliktoj +ExistingFileNewerSelectAction=Elekti agon +ExistingFileNewer2=La ekzistanta dosiero estas pli nova ol tiu instalilo provas instali. +ExistingFileNewerOverwriteExisting=&Anstataŭigu la ekzistantan dosieron +ExistingFileNewerKeepExisting=&Konservu la ekzistantan dosieron (recomendita) +ExistingFileNewerOverwriteOrKeepAll=&Faru ĉi tion por la venontaj konfliktoj +ErrorChangingAttr=Eraro aperis dum provo ĉanĝi atributoj de ekzista dosiero: ErrorCreatingTemp=Eraro aperis dum kreado dosieron en destina dosierujo: ErrorReadingSource=Eraro aperis dum legado de dosiero: ErrorCopying=Eraro aperis dum kopiado de dosiero: -ErrorReplacingExistingFile=Eraro aperis dum relokig`o de ekzistan dosieron: -ErrorRestartReplace=Relanc`o/Relokig`o estas kripligita: -ErrorRenamingTemp=Eraro aperis dum renomig`o del dosiero en destina dosierujo: -ErrorRegisterServer=Estas nepoveble registri DLL/OC`: %1 +ErrorReplacingExistingFile=Eraro aperis dum relokiĝo de ekzistan dosieron: +ErrorRestartReplace=Relanĉo/Relokiĝo estas kripligita: +ErrorRenamingTemp=Eraro aperis dum renomiĝo del dosiero en destina dosierujo: +ErrorRegisterServer=Estas nepoveble registri DLL/OĈ: %1 ErrorRegSvr32Failed=RegSvr32estas kripligita kun elira codo %1 ErrorRegisterTypeLib=Estas nepoveble registri bibliotekon de tipo : %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bita +UninstallDisplayNameMark64Bit=64-bita +UninstallDisplayNameMarkAllUsers=Ĉiuj uzantoj +UninstallDisplayNameMarkCurrentUser=Nuna uzanto + ; *** Post-installation errors ErrorOpeningReadme=Eraro aperis dum malfermado de README dosiero. -ErrorRestartingComputer=Majstro ne povis relanc`i komputilo. Bonvolu fari tion permane. +ErrorRestartingComputer=Majstro ne povis relanĉi komputilo. Bonvolu fari tion permane. ; *** Uninstaller messages UninstallNotFound=Dosiero "%1" ne ekzistas. Estas nepoveble forigi. UninstallOpenError=Dosieron "%1" nepoveble estas malfermi. Estas nepoveble forigi -UninstallUnsupportedVer=\Foriga protokolo "%1" estas en nekonata formato per c`i tia versio de forigprogramo. Estas nepoveble forigi +UninstallUnsupportedVer=\Foriga protokolo "%1" estas en nekonata formato per ĉi tia versio de forigprogramo. Estas nepoveble forigi UninstallUnknownEntry=Ekzistas nekonata pointo (%1) en foriga protokolo -ConfirmUninstall=C`u vi reale volas tute forigi %1 kaj c`iaj komponentoj de g`i? -UninstallOnlyOnWin64=C`i tian instaladon povos forigi nur en 64-bit Vindoso. -OnlyAdminCanUninstall=C`i tian instaladon povos forigi nur uzanto kun administrantaj rajtoj. -UninstallStatusLabel=Bonvolu atendi dum %1 forig`os de via komputilo. +ConfirmUninstall=Ĉu vi reale volas tute forigi %1 kaj ĉiaj komponentoj de ĝi? +UninstallOnlyOnWin64=Ĉi tian instaladon povos forigi nur en 64-bit Vindoso. +OnlyAdminCanUninstall=Ĉi tian instaladon povos forigi nur uzanto kun administrantaj rajtoj. +UninstallStatusLabel=Bonvolu atendi dum %1 foriĝos de via komputilo. UninstalledAll=%1 estis sukcese forigita de via komputilo. -UninstalledMost=Forigo de %1 estas plena.%n%nKelkaj elementoj ne estis forigitaj. G`in poveble estas forigi permane. -UninstalledAndNeedsRestart=Por plenumi forigadon de %1, via komputilo devas esti relanc`ita.%n%nC`u vi volas relanc`i nun? +UninstalledMost=Forigo de %1 estas plena.%n%nKelkaj elementoj ne estis forigitaj. Ĝin poveble estas forigi permane. +UninstalledAndNeedsRestart=Por plenumi forigadon de %1, via komputilo devas esti relanĉita.%n%nĈu vi volas relanĉi nun? UninstallDataCorrupted="%1" dosiero estas kriplita. Estas nepoveble forigi ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Forigi komune uzatan dosieron? -ConfirmDeleteSharedFile2=La sistemo indikas ke sekva komune uzata dosiero jam ne estas uzata per neniel aplikaj`oj. C`u vi volas forigi c`i tian dosieron?%n%nSe ajna programo jam uzas tian dosieron, dum forigo g`i povos malg`uste funkcii. Se vi ne estas certa elektu Ne. Restante en via sistemo la dosiero ne damag`os g`in. +ConfirmDeleteSharedFile2=La sistemo indikas ke sekva komune uzata dosiero jam ne estas uzata per neniel aplikaĵoj. Ĉu vi volas forigi ĉi tian dosieron?%n%nSe ajna programo jam uzas tian dosieron, dum forigo ĝi povos malĝuste funkcii. Se vi ne estas certa elektu Ne. Restante en via sistemo la dosiero ne damaĝos ĝin. SharedFileNameLabel=nomo de dosiero: SharedFileLocationLabel=Loko: WizardUninstalling=Stato de forigo @@ -328,15 +377,15 @@ ShutdownBlockReasonUninstallingApp=Forigado %1. [CustomMessages] -NameAndVersion=%1 versio %2 +NameAndVersion=%1 versio %2 AdditionalIcons=Aldonaj ikonoj: -CreateDesktopIcon=Krei &Labortablan ikonon -CreateQuickLaunchIcon=Krei &Rapida lanc`o ikonon +CreateDesktopIcon=Krei &Labortablan ikonon +CreateQuickLaunchIcon=Krei &Rapida lanĉo ikonon ProgramOnTheWeb=%1 en Reto -UninstallProgram=Rorig`ado %1 -LaunchProgram=Lanc`o %1 -AssocFileExtension=&Asociigi %1 kun %2 dosieraj finaj`oj -AssocingFileExtension=Asociig`as %1 kun %2 dosiera finaj`o... -AutoStartProgramGroupDescription=Lanc`o: -AutoStartProgram=Automate s`alti %1 -AddonHostProgramNotFound=%1 nepoveble estas loki en dosierujo kian vi elektis.%n%nC`u vi volas kontinui c`iokaze? +UninstallProgram=Roriĝado %1 +LaunchProgram=Lanĉo %1 +AssocFileExtension=&Asociigi %1 kun %2 dosieraj finaĵoj +AssocingFileExtension=Asociiĝas %1 kun %2 dosiera finaĵo... +AutoStartProgramGroupDescription=Lanĉo: +AutoStartProgram=Automate ŝalti %1 +AddonHostProgramNotFound=%1 nepoveble estas loki en dosierujo kian vi elektis.%n%nĈu vi volas kontinui ĉiokaze? diff --git a/installer/innosetup/Languages/Farsi.isl b/installer/innosetup/Languages/Farsi.isl index 232a7ce3b..aaed6cd0b 100644 --- a/installer/innosetup/Languages/Farsi.isl +++ b/installer/innosetup/Languages/Farsi.isl @@ -1,13 +1,15 @@ -; *** Inno Setup version 5.5.3+ Farsi messages *** -;Translator:Hessam Mohamadi -;Email:hessam55@hotmail.com +; *** Inno Setup version 6.1.0+ Farsi messages *** +; ; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ +; https://jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). +; +; Translated by: +; Peyman M. (peymanR34@outlook.com) [LangOptions] ; The following three entries are very important. Be sure to read and @@ -15,323 +17,372 @@ LanguageName=Farsi LanguageID=$0429 LanguageCodePage=1256 +RightToLeft=yes ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. -DialogFontName=Tahoma -DialogFontSize=8 -WelcomeFontName=Tahoma -WelcomeFontSize=11 -TitleFontName=Tahoma -TitleFontSize=28 -CopyrightFontName=Tahoma -CopyrightFontSize=8 +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 [Messages] ; *** Application titles -SetupAppTitle= -SetupWindowTitle=%1 - -UninstallAppTitle= -UninstallAppFullTitle=%1 +SetupAppTitle=نصب کننده +SetupWindowTitle=نصب کننده - %1 +UninstallAppTitle=حذف کننده +UninstallAppFullTitle=%1 حذف کننده ; *** Misc. common -InformationTitle= -ConfirmTitle= -ErrorTitle= +InformationTitle=اطلاعات +ConfirmTitle=تایید +ErrorTitle=خطا ; *** SetupLdr messages -SetupLdrStartupMessage= . Ͽ %1 -LdrCannotCreateTemp= . -LdrCannotExecTemp= . +SetupLdrStartupMessage=این %1 را نصب می‌کند. آیا مایل به ادامه هستید؟ +LdrCannotCreateTemp=خطا در ایجاد یک فایل موقت. برنامه نصب لغو شد +LdrCannotExecTemp=خطا در اجرای فایل در پوشه موقت. برنامه نصب لغو شد +HelpTextNote= ; *** Startup error messages -LastErrorMessage=%1.%n%n %2: %3 -SetupFileMissing= . Ԙ %1 -SetupFileCorrupt= ϡ -SetupFileCorruptOrWrongVer= ϡ . Ԙ -InvalidParameter= :%n%n%1 -SetupAlreadyRunning= -WindowsVersionNotSupported= ʡ -WindowsServicePackRequired= %1 %2 -NotOnThisPlatform= %1 -OnlyOnThisPlatform= %1 -OnlyOnTheseArchitectures= Ԑ ʡ :%n%n%1 -MissingWOW64APIs= %1 ǘ ʡ Ԙ -WinVersionTooLowError= %1 %2 -WinVersionTooHighError= %1 %2 -AdminPrivilegesRequired= -PowerUserPrivilegesRequired= -SetupAppRunningError=ǘ %1 %n%n Ӂ -UninstallAppRunningError=ǘ %1 %n%n Ӂ +LastErrorMessage=%1.%n%nخطا %2: %3 +SetupFileMissing=فایل %1 در پوشه نصب وجود ندارد. لطفاً مشکل را برطرف کرده و یا یک کپی جدید از برنامه را دریافت کنید. +SetupFileCorrupt=فایل های نصب کننده آسیب دیده‌اند. لطفاً یک کپی جدید از برنامه را دریافت کنید. +SetupFileCorruptOrWrongVer=فایل های نصب کننده آسیب دیده‌اند، یا با این نسخه از نصب کننده سازگار نیستند. لطفاً مشکل را برطرف کرده و یا یک کپی جدید از برنامه را دریافت کنید. +InvalidParameter=یک پارامتر نامعتبر به خط فرمان ارسال شده است:%n%n%1 +SetupAlreadyRunning=نصب کننده از قبل در حال اجراست. +WindowsVersionNotSupported=این برنامه از نسخه ویندوزی که بر روی کامپیوتر شما در حال اجراست پشتیبانی نمی‌کند. +WindowsServicePackRequired=این برنامه نیازمند %1 سرویس پک %2 یا بالاتر است. +NotOnThisPlatform=این برنامه روی %1 اجرا نمی‌شود. +OnlyOnThisPlatform=این برنامه باید بر روی %1 اجرا شود. +OnlyOnTheseArchitectures=این برنامه تنها می‌تواند بر روی نسخه های ویندوزی نصب شود که برای معماری های پردازنده زیر طراحی شده‌اند:%n%n%1 +WinVersionTooLowError=این برنامه نیازمند %1 نسخه %2 یا بالاتر است. +WinVersionTooHighError=این برنامه نمی‌تواند بر روی %1 نسخه %2 یا بالاتر نصب شود. +AdminPrivilegesRequired=هنگام نصب این برنامه، شما باید به عنوان یک کاربر مدیر وارد سیستم شده باشید. +PowerUserPrivilegesRequired=در هنگام نصب این برنامه، شما باید به عنوان کاربر مدیر وارد سیستم شده باشید و یا اینکه عضو گروه Power Users باشید. +SetupAppRunningError=نصب کننده %1 هم اکنون در حال اجراست.%n%nلطفاً اکنون تمام نمونه های آن را بسته، و سپس برای ادامه بر روی تایید، و یا برای خروج بر روی انصراف کلیک کنید. +UninstallAppRunningError=حذف کننده تشخیص داده است که %1 هم اکنون در حال اجراست.%n%nلطفاً اکنون تمام نمونه های آن را بسته، و سپس برای ادامه بر روی تایید، و یا برای خروج بر روی انصراف کلیک کنید. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=انتخاب نحوه نصب توسط نصب کننده +PrivilegesRequiredOverrideInstruction=انتخاب نحوه نصب +PrivilegesRequiredOverrideText1=%1 را می‌توان برای تمامی کاربران (نیازمند دسترسی مدیر سیستم)، و یا تنها برای شما نصب کرد.‏ +PrivilegesRequiredOverrideText2=%1 را می‌توان تنها برای شما، و یا تمامی کاربران (نیازمند دسترسی مدیر سیستم) است.‏ +PrivilegesRequiredOverrideAllUsers=نصب برای &تمامی کاربران +PrivilegesRequiredOverrideAllUsersRecommended=نصب برای &تمامی کاربران (پیشنهاد می‌شود)‏ +PrivilegesRequiredOverrideCurrentUser=نصب تنها برای &من +PrivilegesRequiredOverrideCurrentUserRecommended=نصب تنها برای &من (پیشنهاد می‌شود)‏ ; *** Misc. errors -ErrorCreatingDir= "%1" -ErrorTooManyFilesInDir= "%1" +ErrorCreatingDir=نصب کننده قادر به ایجاد پوشه نبود "%1" +ErrorTooManyFilesInDir=ایجاد یک فایل در پوشه "%1" بدلیل آنکه حاوی تعداد زیادی فایل است امکان پذیر نیست ; *** Setup common messages -ExitSetupTitle= -ExitSetupMessage= . ǐ ǘ ϡ %n%n . Ͽ -AboutSetupMenuItem=... & -AboutSetupTitle= -AboutSetupMessage=%2 %1%n%3%n%n%1 :%n%4 +ExitSetupTitle=خروج از نصب کننده +ExitSetupMessage=نصب به پایان نرسیده است. در صورتی که اکنون خارج شوید برنامه نصب نخواهد شد.‏%n%nشما می‌توانید نصب کننده را مجدداً در زمانی دیگر برای تکمیل عملیات نصب اجرا کنید.‏%n%nآیا مایل به خروج هستید؟ +AboutSetupMenuItem=&درباره نصب کننده... +AboutSetupTitle=درباره نصب کننده +AboutSetupMessage=%1 نسخه %2%n%3%n%n%1 وب سایت:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons -ButtonBack=< & -ButtonNext=& > -ButtonInstall=& -ButtonOK=& -ButtonCancel=& -ButtonYes=& -ButtonYesToAll= & -ButtonNo=& -ButtonNoToAll= & -ButtonFinish=& -ButtonBrowse=& -ButtonWizardBrowse=& -ButtonNewFolder= +ButtonBack=< &قبلی +ButtonNext=&بعدی > +ButtonInstall=&نصب +ButtonOK=تایید +ButtonCancel=انصراف +ButtonYes=&بله +ButtonYesToAll=بله برای &همه +ButtonNo=&خیر +ButtonNoToAll=ن&ه برای همه +ButtonFinish=&پایان +ButtonBrowse=&مرور... +ButtonWizardBrowse=م&رور...‏ +ButtonNewFolder=&ایجاد پوشه جدید ; *** "Select Language" dialog messages -SelectLanguageTitle= -SelectLanguageLabel= : +SelectLanguageTitle=انتخاب زبان نصب کننده +SelectLanguageLabel=زبانی را که می‌خواهید در حین نصب استفاده کنید را انتخاب کنید. ; *** Common wizard text -ClickNext= +ClickNext=برای ادامه بر روی بعدی کلیک کنید، برای خروج از نصب کننده بر روی انصراف کلیک کنید.‏ BeveledLabel= -BrowseDialogTitle= -BrowseDialogLabel= ϡ Ӂ -NewFolderName= +BrowseDialogTitle=مرور برای پوشه +BrowseDialogLabel=از لیست زیر یک پوشه را انتخاب کرده و سپس بر روی تایید کلیک کنید.‏ +NewFolderName=پوشه جدید ; *** "Welcome" wizard page -WelcomeLabel1= [name] -WelcomeLabel2= [name/ver] %n%n ϡ +WelcomeLabel1=به ویزارد نصب کننده [name] خوش آمدید +WelcomeLabel2=این [name/ver] را بر روی کامپیوتر شما نصب می‌کند.‏%n%nپیشنهاد می‌شود قبل از ادامه تمامی اپلیکیشن های دیگر را ببندید.‏ ; *** "Password" wizard page -WizardPassword= -PasswordLabel1= -PasswordLabel3= ϡӁ . 捘 ѐ -PasswordEditLabel=: -IncorrectPassword= . +WizardPassword=گذرواژه +PasswordLabel1=این نصب کننده با گذرواژه محافظت شده است.‏ +PasswordLabel3=لطفاً یک گذرواژه را وارد کنید، سپس بر روی بعدی کلیک کنید. گذرواژه ها حساس به حروف بزرگ و کوچک هستند.‏ +PasswordEditLabel=&گذرواژه:‏ +IncorrectPassword=گذرواژه وارد شده اشتباه است. لطفاً مجدداً تلاش کنید.‏ ; *** "License Agreement" wizard page -WizardLicense= -LicenseLabel= -LicenseLabel3= . ȁ -LicenseAccepted= &흁 -LicenseNotAccepted= &흁 +WizardLicense=توافقنامه استفاده +LicenseLabel=لطفاً اطلاعات مهم زیر را قبل از ادامه مطالعه کنید.‏ +LicenseLabel3=لطفاً توافقنامه زیر را مطالعه کنید. شما باید مفاد این توافقنامه را پیش از ادامه نصب برنامه بپذیرید. +LicenseAccepted=من توافقنامه را &می‌پذیرم +LicenseNotAccepted=من توافقنامه را &نمی‌پذیرم ; *** "Information" wizard pages -WizardInfoBefore= -InfoBeforeLabel= -InfoBeforeClickLabel= ϡ -WizardInfoAfter= -InfoAfterLabel= -InfoAfterClickLabel= ϡ +WizardInfoBefore=اطلاعات +InfoBeforeLabel=لطفاً اطلاعات مهم زیر را قبل از ادامه مطالعه کنید.‏‏ +InfoBeforeClickLabel=زمانی که آماده برای ادامه نصب هستید، بر روی بعدی کلیک کنید‏.‏ +WizardInfoAfter=اطلاعات +InfoAfterLabel=لطفاً اطلاعات مهم زیر را قبل از ادامه مطالعه کنید.‏ +InfoAfterClickLabel=زمانی که آماده برای ادامه‌ی نصب هستید، بر روی بعدی کلیک کنید‏.‏ ; *** "User Information" wizard page -WizardUserInfo= -UserInfoDesc= -UserInfoName= &: -UserInfoOrg=&: -UserInfoSerial= &: -UserInfoNameRequired= +WizardUserInfo=اطلاعات کاربر +UserInfoDesc=لطفاً اطلاعات خود را وارد کنید.‏ +UserInfoName=&نام کاربری:‏ +UserInfoOrg=&سازمان:‏ +UserInfoSerial=&شماره سریال:‏ +UserInfoNameRequired=شما باید یک نام را وارد کنید. ; *** "Select Destination Location" wizard page -WizardSelectDir= -SelectDirDesc= Ͽ [name] -SelectDirLabel3= [name] -SelectDirBrowseLabel= . ʡ -DiskSpaceMBLabel=ʝ [mb] -CannotInstallToNetworkDrive= Ș -CannotInstallToUNCPath= -InvalidPath= ϡ :%n%nC:\APP%n%n :%n%n\\server\share -InvalidDrive= ǘ ϡ . -DiskSpaceWarningTitle= -DiskSpaceWarning= %1 ʡ %2 .%n%n Ͽ -DirNameTooLong= -InvalidDirName= -BadDirName32= ǘ Ȑ:%n%n%1 -DirExistsTitle= -DirExists= :%n%n%1%n%nǘ . ϡ Ͽ -DirDoesntExistTitle= -DirDoesntExist= :%n%n%1%n%n . Ͽ +WizardSelectDir=انتخاب محل مقصد +SelectDirDesc=کجا باید [name] نصب شود؟ +SelectDirLabel3=نصب کننده [name] را در پوشه زیر نصب می‌کند.‏ +SelectDirBrowseLabel=برای ادامه، بر روی بعدی کلیک کنید. اگر مایل به انتخاب پوشه دیگری هستید، بر روی مرور کلیک کنید.‏ +DiskSpaceGBLabel=حداقل [gb] گیگابایت از فضای خالی دیسک مورد نیاز است.‏ +DiskSpaceMBLabel=حداقل [mb] مگابایت از فضای خالی دیسک مورد نیاز است.‏ +CannotInstallToNetworkDrive=نصب کننده نمی‌تواند در یک درایو شبکه نصب را انجام دهد. +CannotInstallToUNCPath=نصب کننده نمی‌تواند در یک UNC path نصب را انجام دهد. +InvalidPath=شما باید یک آدرس کامل همراه با اسم درایو وارد کنید؛ به عنوان مثال:%n%nC:\APP%n%nو یا یک مسیر UNC به شکل مقابل:%n%n\\server\share +InvalidDrive=درایو یا UNC share انتخاب شده وجود ندارد و یا غیر قابل دسترسی است. لطفاً یک مسیر دیگر را انتخاب کنید. +DiskSpaceWarningTitle=فضای خالی دیسک کافی نیست +DiskSpaceWarning=نصب کننده به حداقل %1 کیلوبایت فضای خالی برای نصب نیاز دارد، اما درایو انتخاب شده فقط %2 کیلوبایت فضای آزاد دارد.%n%nآیا مایل به ادامه هستید؟ +DirNameTooLong=نام پوشه یا مسیر بسیار طولانی است.‏ +InvalidDirName=نام پوشه صحیح نیست.‏ +BadDirName32=نام پوشه‌ها نمی‌تواند شامل کاراکتر های مقابل باشد:%n%n%1 +DirExistsTitle=پوشه از قبل وجود دارد +DirExists=این پوشه:%n%n%1%n%nاز قبل وجود دارد. آیا بهرحال مایل به نصب در آن پوشه هستید؟ +DirDoesntExistTitle=پوشه وجود ندارد +DirDoesntExist=این پوشه:%n%n%1%n%nوجود ندارد. آیا مایل به ساختن آن هستید؟ ; *** "Select Components" wizard page -WizardSelectComponents= -SelectComponentsDesc= Ͽ -SelectComponentsLabel2= ȡ ϡ . ϡ -FullInstallation= +WizardSelectComponents=انتخاب اجزاء +SelectComponentsDesc=کدام اجزاء باید نصب شوند؟ +SelectComponentsLabel2=اجزایی که مایل به نصب آن‌ها هستید را انتخاب کنید؛ اجزایی را که نمی‌خواهید نصب کنید را از حالت انتخاب بردارید.‏ زمانی که آماده برای ادامه بودید بر روی بعدی کلیک کنید. +FullInstallation=نصب کامل ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation= -CustomInstallation= -NoUninstallWarningTitle= -NoUninstallWarning= ǘ :%n%n%1%n%n .%n%n Ͽ -ComponentSize1=%1 -ComponentSize2=%1 -ComponentsDiskSpaceMBLabel= ʝ [mb] Ә +CompactInstallation=نصب فشرده +CustomInstallation=نصب سفارشی +NoUninstallWarningTitle=اجزاء وجود دارند +NoUninstallWarning=نصب کننده تشخیص داده است که اجزای فوق از قبل بر روی کامپیوتر شما نصب شده است:%n%n%1%n%nعدم انتخاب این اجزاء باعث حذف شدن آن‌ها نمی‌شود.%n%nآیا مایل به ادامه هستید؟ +ComponentSize1=%1 کیلوبایت +ComponentSize2=%1 مگابایت +ComponentsDiskSpaceGBLabel=انتخاب فعلی به حداقل [gb] گیگابایت فضای خالی دیسک نیاز دارد.‏ +ComponentsDiskSpaceMBLabel=انتخاب فعلی به حداقل [mb] مگابایت فضای خالی دیسک نیاز دارد.‏ ; *** "Select Additional Tasks" wizard page -WizardSelectTasks= -SelectTasksDesc= Ͽ -SelectTasksLabel2= ȡӁ [name] +WizardSelectTasks=انتخاب وظایف اضافی +SelectTasksDesc=کدام وظایف اضافی باید انجام شود؟ +SelectTasksLabel2=وظایف اضافی را که تمایل دارید در هنگام نصب [name] انجام داده شود را انتخاب کرده، سپس بر روی بعدی کلیک کنید.‏ ; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup= -SelectStartMenuFolderDesc= Ͽ -SelectStartMenuFolderLabel3= ҡ -SelectStartMenuFolderBrowseLabel= . ʡ -MustEnterGroupName= -GroupNameTooLong= -InvalidGroupName= -BadGroupName= ǘ :%n%n%1 -NoProgramGroupCheck2= +WizardSelectProgramGroup=انتخاب پوشه منوی استارت +SelectStartMenuFolderDesc=نصب کننده در کجا باید میانبر های برنامه را قرار دهد؟ +SelectStartMenuFolderLabel3=نصب کننده میانبر های برنامه را در پوشه زیر در منوی استارت ایجاد خواهد کرد. +SelectStartMenuFolderBrowseLabel=برای ادامه، بر روی بعدی کلیک کنید. در صورتی که تمایل به انتخاب پوشه دیگری دارید، بر روی مرور کلیک کنید. +MustEnterGroupName=شما باید یک اسم پوشه را وارد کنید. +GroupNameTooLong=نام پوشه و یا مسیر آن بسیار طولانی است. +InvalidGroupName=نام پوشه صحیح نیست. +BadGroupName=نام پوشه نباید شامل هر یک از کاراکتر های زیر باشد:%n%n%1 +NoProgramGroupCheck2=پوشه‌ای در منوی استارت ایجاد &نشود ; *** "Ready to Install" wizard page -WizardReady= -ReadyLabel1= [name] ҡ -ReadyLabel2a= -ReadyLabel2b= ȡ -ReadyMemoUserInfo= : -ReadyMemoDir= : -ReadyMemoType= : -ReadyMemoComponents= : -ReadyMemoGroup= : -ReadyMemoTasks= : +WizardReady=آماده نصب +ReadyLabel1=نصب کننده آماده شروع نصب [name] بر روی کامپیوتر شماست.‏ +ReadyLabel2a=برای ادامه نصب بر روی نصب کلیک کنید، و یا اگر تمایل به بازبینی یا تغییر تنظیمات دارید بر روی قبلی کلیک کنید. +ReadyLabel2b=برای ادامه نصب بر روی نصب کلیک کنید.‏ +ReadyMemoUserInfo=اطلاعات کاربر: +ReadyMemoDir=محل مقصد: +ReadyMemoType=نوع نصب: +ReadyMemoComponents=اجزاء انتخاب شده: +ReadyMemoGroup=پوشه منوی استارت: +ReadyMemoTasks=وظایف اضافی: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=درحال دانلود فایل های اضافی... +ButtonStopDownload=&توقف دانلود +StopDownload=آیا مطمئن هستید که می‌خواهید دانلود را متوقف کنید؟ +ErrorDownloadAborted=دانلود متوقف شد +ErrorDownloadFailed=دانلود ناموفق بود: %1 %2 +ErrorDownloadSizeFailed=دریافت حجم ناموفق بود: %1 %2 +ErrorFileHash1=هش فایل ناموفق بود: %1 +ErrorFileHash2=هش نامعتبر فایل: مورد انتظار %، پیدا شده %2 +ErrorProgress=پیشرفت نامعتبر: %1 از %2 +ErrorFileSize=اندازه فایل نامعتبر: مورد انتظار %، پیدا شده %2 ; *** "Preparing to Install" wizard page -WizardPreparing= -PreparingDesc= [name] -PreviousInstallNotCompleted= ȡ %n%n [name] -CannotContinue= ϡ -ApplicationsFound= . Ϙ -ApplicationsFound2= . Ϙ . ȡ . -CloseApplications=& Ϙ -DontCloseApplications=& -ErrorCloseApplications= Ϙ . +WizardPreparing=در حال آماده سازی برای نصب +PreparingDesc=نصب کننده در حال آماده سازی برای نصب [name] بر روی کامپیوتر شماست. +PreviousInstallNotCompleted=نصب/حذف برنامه قبلی تکمیل نشده است. شما باید کامپیوتر خود را برای تکمیل عملیات نصب مجدداً راه‌اندازی کنید.%n%nپس از ری‌استارت کامپیوتر، نصب کننده را مجدداً برای تکمیل عملیات نصب [name] اجرا کنید. +CannotContinue=نصب کننده قادر به ادامه نیست. لطفاً برای خروج بر روی انصراف کلیک کنید. +ApplicationsFound=اپلیکیشن های زیر در حال استفاده از فایل هایی هستند که نیازمند بروزرسانی توسط نصب کننده هستند. پیشنهاد می‌شود به نصب کننده اجازه دهید تا این اپلیکیشن ها به صورت خودکار بسته شوند. +ApplicationsFound2=اپلیکیشن های زیر در حال استفاده از فایل هایی هستند که نیازمند بروزرسانی توسط نصب کننده هستند. پیشنهاد می‌شود به نصب کننده اجازه دهید تا این اپلیکیشن ها به صورت خودکار بسته شوند. پس از پایان نصب، نصب کننده تلاش می‌کند تا این اپلیکیشن ها را مجدداً اجرا کند. +CloseApplications=بستن &خودکار اپلیکیشن ها +DontCloseApplications=اپلیکیشن ها بسته &نشوند +ErrorCloseApplications=نصب کننده قادر به بستن خودکار تمام اپلیکیشن ها نبود. پیشنهاد می‌شود تمام اپلیکیشن هایی که از فایل هایی که نیاز به بروزرسانی توسط نصب کننده را دارند را قبل از ادامه ببندید. +PrepareToInstallNeedsRestart=نصب کننده باید کامپیوتر را مجدداً راه‌اندازی کند. پس از ری‌استارت کامپیوتر، نصب کننده را برای تکمیل عملیات نصب [name] مجدداً اجرا کنید.%n%nآیا مایل به راه‌اندازی مجدد هستید؟ ; *** "Installing" wizard page -WizardInstalling= -InstallingLabel= [name] +WizardInstalling=در حال نصب +InstallingLabel=لطفاً تا زمانی که نصب کننده [name] را بر روی کامپیوتر شما نصب می‌کند، صبر کنید. ; *** "Setup Completed" wizard page -FinishedHeadingLabel= [name] -FinishedLabelNoIcons= [name] -FinishedLabel= [name] -ClickFinish= -FinishedRestartLabel= . Ͽ [name] -FinishedRestartMessage= [name] %n%n Ͽ -ShowReadmeCheck= -YesRadio= -NoRadio=ѡ +FinishedHeadingLabel=در حال تکمیل ویزارد نصب کننده [name] +FinishedLabelNoIcons=نصب کننده، عملیات نصب [name] بر روی کامپیوتر شما را به پایان رساند. +FinishedLabel=نصب کننده، عملیات نصب [name] بر روی کامپیوتر شما را به پایان رساند. اپلیکیشن می‌تواند با انتخاب میانبر های نصب شده اجرا شود. +ClickFinish=برای خروج از نصب کننده بر روی پایان کلیک کنید. +FinishedRestartLabel=برای تکمیل عملیات نصب [name]، نصب کننده باید کامپیوتر شما راه مجدداً راه‌اندازی کند. آیا هم اکنون مایل به ری‌استارت هستید؟ +FinishedRestartMessage=برای تکمیل عملیات نصب [name]، نصب کننده باید کامپیوتر شما را مجدداً راه‌اندازی کند.%n%nآیا هم اکنون مایل به ری‌استارت هستید؟ +ShowReadmeCheck=بله، مایل به مشاهده فایل README هستم. +YesRadio=&بله، اکنون کامپیوتر را دوباره راه‌اندازی کن +NoRadio=&نه، بعداً خودم کامپیوتر را راه‌اندازی مجدد خواهم کرد ; used for example as 'Run MyProg.exe' -RunEntryExec=%1 +RunEntryExec=اجرای %1 ; used for example as 'View Readme.txt' -RunEntryShellExec=%1 +RunEntryShellExec=مشاهده %1 ; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle= Ә -SelectDiskLabel2= %1 Ә%n%nǐ Ә ϡ -PathLabel=&: -FileNotInDir2= "%1" "%2" . Ә -SelectDirectoryLabel= Ә +ChangeDiskTitle=نصب کننده به دیسک بعدی نیاز دارد +SelectDiskLabel2=لطفاً دیسک %1 را وارد کرده و بر روی تایید کلیک کنید.%n%nدر صورتی که فایل های روی این دیسک در پوشه‌ای غیر از پوشه نمایش داده شده قابل پیدا شدن است، مسیر صحیح را وارد کرده و یا بر روی مرور کلیک کنید. +PathLabel=&مسیر: +FileNotInDir2=فایل "%1" در مسیر "%2" پیدا نشد. لطفاً دیسک صحیح را وارد کرده و یا یک پوشه دیگر را انتخاب کنید. +SelectDirectoryLabel=لطفاً آدرس دیسک بعدی را تعیین کنید. ; *** Installation phase messages -SetupAborted= %n%n Ԙ -EntryAbortRetryIgnore= ʡ +SetupAborted=نصب کننده تکمیل نشد.%n%nلطفاً مشکل را برطرف کرده و سپس نصب کننده را مجدداً اجرا کنید. +AbortRetryIgnoreSelectAction=انتخاب عمل +AbortRetryIgnoreRetry=&تلاش مجدد +AbortRetryIgnoreIgnore=&صرف نظر از خطا و ادامه +AbortRetryIgnoreCancel=انصراف از عملیات نصب ; *** Installation status messages -StatusClosingApplications=... -StatusCreateDirs=... -StatusExtractFiles=... -StatusCreateIcons=... -StatusCreateIniEntries=...INI -StatusCreateRegistryEntries=.. -StatusRegisterFiles=... -StatusSavingUninstall=... -StatusRunProgram=... -StatusRestartingApplications=... -StatusRollback=... Ґ +StatusClosingApplications=درحال بستن اپلیکیشن ها... +StatusCreateDirs=ایجاد پوشه ها... +StatusExtractFiles=استخراج فایل ها... +StatusCreateIcons=ایجاد میانبر ها... +StatusCreateIniEntries=ایجاد ورودی های INI... +StatusCreateRegistryEntries=ایجاد ورودی های ریجستری... +StatusRegisterFiles=در حال ریجستر فایل ها... +StatusSavingUninstall=در حال ذخیره اطلاعات حذف کننده... +StatusRunProgram=در حال پایان نصب... +StatusRestartingApplications=در حال راه‌اندازی مجدد اپلیکیشن ها... +StatusRollback=درحال بازگردانی تغییرات... ; *** Misc. errors -ErrorInternal2= : %1 -ErrorFunctionFailedNoCode=%1 -ErrorFunctionFailed=%1 ϡ %2 -ErrorFunctionFailedWithMessage=%1 ϡ %2.%n%3 -ErrorExecutingProgram= :%n%1 +ErrorInternal2=خطای داخلی: %1 +ErrorFunctionFailedNoCode=%1 ناموفق +ErrorFunctionFailed=%1 ناموفق؛ کد %2 +ErrorFunctionFailedWithMessage=%1 ناموفق؛ کد %2.%n%3 +ErrorExecutingProgram=خطا در اجرای فایل:%n%1 ; *** Registry errors -ErrorRegOpenKey= Ҙ :%n%1\%2 -ErrorRegCreateKey= :%n%1\%2 -ErrorRegWriteKey= :%n%1\%2 +ErrorRegOpenKey=خطا در بازکردن کلید ریجستری:%n%1\%2 +ErrorRegCreateKey=خطا در ایجاد کلید ریجستری:%n%1\%2 +ErrorRegWriteKey=خطا در نوشتن در کلید ریجستری:%n%1\%2 ; *** INI errors -ErrorIniEntry=" "%1 +ErrorIniEntry=خطا در ایجاد ورودی INI در فایل "%1". ; *** File copying errors -FileAbortRetryIgnore= ( ) -FileAbortRetryIgnore2= ( ) -SourceIsCorrupted= -SourceDoesntExist= "%1" -ExistingFileReadOnly= %n%n 塍 -ErrorReadingExistingDest= : -FileExists= %n%n Ͽ -ExistingFileNewer= . .%n%n Ͽ -ErrorChangingAttr= : -ErrorCreatingTemp= : -ErrorReadingSource= : -ErrorCopying= : -ErrorReplacingExistingFile= : -ErrorRestartReplace= : -ErrorRenamingTemp= : -ErrorRegisterServer= / : %1 -ErrorRegSvr32Failed=%1 -ErrorRegisterTypeLib= : %1 +FileAbortRetryIgnoreSkipNotRecommended=&پرش از این فایل (پیشنهاد نمی‌شود) +FileAbortRetryIgnoreIgnoreNotRecommended=&نادیده گرفتن خطا و ادامه (پیشنهاد نمی‌شود) +SourceIsCorrupted=فایل منبع آسیب دیده است +SourceDoesntExist=فایل منبع "%1" وجود ندارد +ExistingFileReadOnly2=فایل موجود بدلیل فقط-خواندنی بودن قابل جایگزینی نیست. +ExistingFileReadOnlyRetry=&حذف خصوصیت فقط-خواندنی و تلاش مجدد +ExistingFileReadOnlyKeepExisting=&نگه داشتن فایل موجود +ErrorReadingExistingDest=در هنگام تلاش برای خواندن فایل موجود خطایی رخ داده است: +FileExistsSelectAction=انتخاب عمل +FileExists2=فایل از قبل وجود دارد. +FileExistsOverwriteExisting=&بازنویسی فایل موجود +FileExistsKeepExisting=&نگه‌داشتن فایل موجود +FileExistsOverwriteOrKeepAll=&این کار را برای تداخل های بعد انجام بده +ExistingFileNewerSelectAction=انتخاب عمل +ExistingFileNewer2=فایل موجود از فایلی که نصب کننده در تلاش برای نصب آن است جدیدتر است. +ExistingFileNewerOverwriteExisting=&بازنویسی فایل موجود +ExistingFileNewerKeepExisting=&نگه داشتن فایل موجود (پیشنهاد می‌شود) +ExistingFileNewerOverwriteOrKeepAll=&این کار را برای تداخل های بعدی انجام بده +ErrorChangingAttr=در هنگام تلاش برای تغییر خصوصیت فایل موجود خطایی رخ داده است: +ErrorCreatingTemp=در هنگام تلاش برای ایجاد یک فایل در پوشه مقصد خطایی رخ داده است: +ErrorReadingSource=در هنگام تلاش برای خواندن فایل مبداء خطایی رخ داده است: +ErrorCopying=در هنگام تلاش برای کپی فایل خطایی رخ داده است: +ErrorReplacingExistingFile=در هنگام تلاش برای جایگزینی فایل موجود خطایی رخ داده است: +ErrorRestartReplace=RestartReplace ناموفق بود: +ErrorRenamingTemp=در هنگام تلاش برای تغییر نام یک فایل در پوشه مقصد خطایی رخ داده است: +ErrorRegisterServer=خطا در ریجستر DLL/OCX برای: %1 +ErrorRegSvr32Failed=RegSvr32 با کد خطای ناموفق بود %1 +ErrorRegisterTypeLib=قادر به ریجستر کتابخانه نوع نبود: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2، %3) +UninstallDisplayNameMark32Bit=32-بیت +UninstallDisplayNameMark64Bit=64-بیت +UninstallDisplayNameMarkAllUsers=تمامی کاربران +UninstallDisplayNameMarkCurrentUser=کاربر فعلی ; *** Post-installation errors -ErrorOpeningReadme= -ErrorRestartingComputer= . +ErrorOpeningReadme=در هنگام تلاش برای بازکردن فایل README خطایی رخ داده است. +ErrorRestartingComputer=نصب کننده قادر به راه‌اندازی مجدد کامپیوتر نبود. لطفاً به صورت دستی ری‌استارت کنید. ; *** Uninstaller messages -UninstallNotFound= . "%1" -UninstallOpenError= . "%1" -UninstallUnsupportedVer= . "%1" -UninstallUnknownEntry= (%1) -ConfirmUninstall= Ͽ %1 -UninstallOnlyOnWin64= ҝ 64 -OnlyAdminCanUninstall= -UninstallStatusLabel= %1 -UninstalledAll= %1 -UninstalledMost= %1 %n%n ϡ -UninstalledAndNeedsRestart= %1 %n%n Ͽ -UninstallDataCorrupted= . "%1" +UninstallNotFound=فایل "%1" وجود ندارد. حذف امکان پذیر نیست. +UninstallOpenError=امکان باز کردن فایل"%1" وجود ندارد. حذف امکان پذیر نیست +UninstallUnsupportedVer=فایل لاگ حذف کننده "%1" در فرمتی قرار دارد که توسط این نسخه از حذف کننده قابل شناسایی نیست. حذف امکان پذیر نیست +UninstallUnknownEntry=با یک ورودی ناشناخته (%1) در فایل لاگ حذف مواجه شده است +ConfirmUninstall=آیا از حذف %1 و تمام اجزای آن اطمینان دارید؟ +UninstallOnlyOnWin64=این برنامه نصب شده تنها در ویندوز 64-بیت قابل حذف است. +OnlyAdminCanUninstall=این برنامه نصب شده، تنها توسط یک کاربر با دسترسی مدیر قابل حذف است. +UninstallStatusLabel=لطفاً تا زمان حذف %1 از کامپیوتر شما صبر کنید. +UninstalledAll=%1 با موفقیت از روی کامپیوتر شما حذف شد. +UninstalledMost=%1 حذف تکمیل شد.%n%nبرخی از اجزاء را نمی‌توان حذف کرد. این موارد به صورت جداگانه قابل حذف هستند. +UninstalledAndNeedsRestart=برای تکمیل حذف %1 کامپیوتر شما باید مجدداً راه‌اندازی شود.%n%nآیا مایل هستید هم‌اکنون ری‌استارت شود؟ +UninstallDataCorrupted="%1" فایل ناقص است. حذف امکان پذیر نیست ; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle= ј Ͽ -ConfirmDeleteSharedFile2= ǘ . ǘ Ͽ%n%nǐ 흘 ϡ . ǐ . Ԙ -SharedFileNameLabel= : -SharedFileLocationLabel=: -WizardUninstalling= -StatusUninstalling=...%1 +ConfirmDeleteSharedFileTitle=حذف فایل اشتراکی؟ +ConfirmDeleteSharedFile2=سیستم نشان می‌دهد که فایل اشتراکی زیر دیگر توسط هیچ برنامه دیگری در حال استفاده نیست. آیا مایل هستید که حذف کننده این فایل اشتراکی را حذف کند؟?%n%nاگر برنامه‌هایی هنوز از این فایل استفاده می‌کنند، با حذف این فایل این برنامه‌ها ممکن است به درستی کار نکنند. اگر مطمئن نیستید، خیر را انتخاب کنید. نگه‌داشتن فایل بر روی سیستم شما هیچ آسیبی نمی‌رساند. +SharedFileNameLabel=نام فایل: +SharedFileLocationLabel=محل فایل: +WizardUninstalling=وضعیت حذف +StatusUninstalling=در حال حذف %1... ; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=%1 -ShutdownBlockReasonUninstallingApp=%1 +ShutdownBlockReasonInstallingApp=در حال نصب %1. +ShutdownBlockReasonUninstallingApp=در حال حذف %1. ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] -NameAndVersion=%1 %2 -AdditionalIcons= : -CreateDesktopIcon= Әǁ -CreateQuickLaunchIcon= -ProgramOnTheWeb=%1 -UninstallProgram=%1 -LaunchProgram=%1 -AssocFileExtension= %1 %2 & -AssocingFileExtension= %1 %2 -AutoStartProgramGroupDescription= : -AutoStartProgram=%1 Ϙ -AddonHostProgramNotFound=%1 .%n%n Ͽ +NameAndVersion=%1 نسخه %2 +AdditionalIcons=میانبر های جانبی: +CreateDesktopIcon=ایجاد &میانبر روی دسکتاپ +CreateQuickLaunchIcon=ایجاد یک میانبر اجرای &سریع +ProgramOnTheWeb=%1 بر روی وب +UninstallProgram=حذف %1 +LaunchProgram=اجرای %1 +AssocFileExtension=&اختصاص دادن %1 با پسوند فایل %2 +AssocingFileExtension=در حال اختصاص %1 با پسوند فایل %2... +AutoStartProgramGroupDescription=شروع همراه با ویندوز: +AutoStartProgram=شروع خودکار %1 +AddonHostProgramNotFound=%1 در پوشه انتخاب شده یافت نشد.%n%nآیا بهرحال مایل به ادامه هستید؟ \ No newline at end of file diff --git a/installer/innosetup/Languages/Finnish.isl b/installer/innosetup/Languages/Finnish.isl new file mode 100644 index 000000000..17a5f2582 --- /dev/null +++ b/installer/innosetup/Languages/Finnish.isl @@ -0,0 +1,359 @@ +; *** Inno Setup version 6.1.0+ Finnish messages *** +; +; Finnish translation by Antti Karttunen +; E-mail: antti.j.karttunen@iki.fi +; Last modification date: 2020-08-02 + +[LangOptions] +LanguageName=Suomi +LanguageID=$040B +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Asennus +SetupWindowTitle=%1 - Asennus +UninstallAppTitle=Asennuksen poisto +UninstallAppFullTitle=%1 - Asennuksen poisto + +; *** Misc. common +InformationTitle=Ilmoitus +ConfirmTitle=Varmistus +ErrorTitle=Virhe + +; *** SetupLdr messages +SetupLdrStartupMessage=Tll asennusohjelmalla asennetaan %1. Haluatko jatkaa? +LdrCannotCreateTemp=Vliaikaistiedostoa ei voitu luoda. Asennus keskeytettiin +LdrCannotExecTemp=Vliaikaisessa hakemistossa olevaa tiedostoa ei voitu suorittaa. Asennus keskeytettiin + +; *** Startup error messages +LastErrorMessage=%1.%n%nVirhe %2: %3 +SetupFileMissing=Tiedostoa %1 ei lydy asennushakemistosta. Korjaa ongelma tai hanki uusi kopio ohjelmasta. +SetupFileCorrupt=Asennustiedostot ovat vaurioituneet. Hanki uusi kopio ohjelmasta. +SetupFileCorruptOrWrongVer=Asennustiedostot ovat vaurioituneet tai ovat epyhteensopivia tmn Asennuksen version kanssa. Korjaa ongelma tai hanki uusi kopio ohjelmasta. +InvalidParameter=Virheellinen komentoriviparametri:%n%n%1 +SetupAlreadyRunning=Asennus on jo kynniss. +WindowsVersionNotSupported=Tm ohjelma ei tue kytss olevaa Windowsin versiota. +WindowsServicePackRequired=Tm ohjelma vaatii %1 Service Pack %2 -pivityksen tai myhemmn. +NotOnThisPlatform=Tm ohjelma ei toimi %1-kyttjrjestelmss. +OnlyOnThisPlatform=Tm ohjelma toimii vain %1-kyttjrjestelmss. +OnlyOnTheseArchitectures=Tm ohjelma voidaan asentaa vain niihin Windowsin versioihin, jotka on suunniteltu seuraaville prosessorityypeille:%n%n%1 +WinVersionTooLowError=Tm ohjelma vaatii version %2 tai myhemmn %1-kyttjrjestelmst. +WinVersionTooHighError=Tt ohjelmaa ei voi asentaa %1-kyttjrjestelmn versioon %2 tai myhempn. +AdminPrivilegesRequired=Sinun tytyy kirjautua sisn jrjestelmnvalvojana asentaaksesi tmn ohjelman. +PowerUserPrivilegesRequired=Sinun tytyy kirjautua sisn jrjestelmnvalvojana tai tehokyttjn asentaaksesi tmn ohjelman. +SetupAppRunningError=Asennus lysi kynniss olevan kopion ohjelmasta %1.%n%nSulje kaikki kynniss olevat kopiot ohjelmasta ja valitse OK jatkaaksesi, tai valitse Peruuta poistuaksesi. +UninstallAppRunningError=Asennuksen poisto lysi kynniss olevan kopion ohjelmasta %1.%n%nSulje kaikki kynniss olevat kopiot ohjelmasta ja valitse OK jatkaaksesi, tai valitse Peruuta poistuaksesi. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Valitse asennustapa +PrivilegesRequiredOverrideInstruction=Valitse, kenen kyttn ohjelma asennetaan +PrivilegesRequiredOverrideText1=%1 voidaan asentaa kaikille kyttjille (vaatii jrjestelmnvalvojan oikeudet) tai vain sinun kyttsi. +PrivilegesRequiredOverrideText2=%1 voidaan asentaa vain sinun kyttsi tai kaikille kyttjille (vaatii jrjestelmnvalvojan oikeudet). +PrivilegesRequiredOverrideAllUsers=Asenna &kaikille kyttjille +PrivilegesRequiredOverrideAllUsersRecommended=Asenna &kaikille kyttjille (suositus) +PrivilegesRequiredOverrideCurrentUser=Asenna vain &minun kyttni +PrivilegesRequiredOverrideCurrentUserRecommended=Asenna vain &minun kyttni (suositus) + +; *** Misc. errors +ErrorCreatingDir=Asennus ei voinut luoda hakemistoa "%1" +ErrorTooManyFilesInDir=Tiedoston luominen hakemistoon "%1" eponnistui, koska se sislt liian monta tiedostoa + +; *** Setup common messages +ExitSetupTitle=Poistu Asennuksesta +ExitSetupMessage=Asennus ei ole valmis. Jos lopetat nyt, ohjelmaa ei asenneta.%n%nVoit ajaa Asennuksen toiste asentaaksesi ohjelman.%n%nLopetetaanko Asennus? +AboutSetupMenuItem=&Tietoja Asennuksesta... +AboutSetupTitle=Tietoja Asennuksesta +AboutSetupMessage=%1 versio %2%n%3%n%n%1 -ohjelman kotisivu:%n%4 +AboutSetupNote= +TranslatorNote=Suomenkielinen knns: Antti Karttunen (antti.j.karttunen@iki.fi) + +; *** Buttons +ButtonBack=< &Takaisin +ButtonNext=&Seuraava > +ButtonInstall=&Asenna +ButtonOK=OK +ButtonCancel=Peruuta +ButtonYes=&Kyll +ButtonYesToAll=Kyll k&aikkiin +ButtonNo=&Ei +ButtonNoToAll=E&i kaikkiin +ButtonFinish=&Lopeta +ButtonBrowse=S&elaa... +ButtonWizardBrowse=S&elaa... +ButtonNewFolder=&Luo uusi kansio + +; *** "Select Language" dialog messages +SelectLanguageTitle=Valitse Asennuksen kieli +SelectLanguageLabel=Valitse asentamisen aikana kytettv kieli. + +; *** Common wizard text +ClickNext=Valitse Seuraava jatkaaksesi tai Peruuta poistuaksesi. +BeveledLabel= +BrowseDialogTitle=Selaa kansioita +BrowseDialogLabel=Valitse kansio allaolevasta listasta ja valitse sitten OK jatkaaksesi. +NewFolderName=Uusi kansio + +; *** "Welcome" wizard page +WelcomeLabel1=Tervetuloa [name] -asennusohjelmaan. +WelcomeLabel2=Tll asennusohjelmalla koneellesi asennetaan [name/ver]. %n%nOn suositeltavaa, ett suljet kaikki muut kynniss olevat sovellukset ennen jatkamista. Tm auttaa vlttmn ristiriitatilanteita asennuksen aikana. + +; *** "Password" wizard page +WizardPassword=Salasana +PasswordLabel1=Tm asennusohjelma on suojattu salasanalla. +PasswordLabel3=Anna salasana ja valitse sitten Seuraava jatkaaksesi.%n%nIsot ja pienet kirjaimet ovat eriarvoisia. +PasswordEditLabel=&Salasana: +IncorrectPassword=Antamasi salasana oli virheellinen. Anna salasana uudelleen. + +; *** "License Agreement" wizard page +WizardLicense=Kyttoikeussopimus +LicenseLabel=Lue seuraava trke tiedotus ennen kuin jatkat. +LicenseLabel3=Lue seuraava kyttoikeussopimus tarkasti. Sinun tytyy hyvksy sopimus, jos haluat jatkaa asentamista. +LicenseAccepted=&Hyvksyn sopimuksen +LicenseNotAccepted=&En hyvksy sopimusta + +; *** "Information" wizard pages +WizardInfoBefore=Tiedotus +InfoBeforeLabel=Lue seuraava trke tiedotus ennen kuin jatkat. +InfoBeforeClickLabel=Kun olet valmis jatkamaan asentamista, valitse Seuraava. +WizardInfoAfter=Tiedotus +InfoAfterLabel=Lue seuraava trke tiedotus ennen kuin jatkat. +InfoAfterClickLabel=Kun olet valmis jatkamaan asentamista, valitse Seuraava. + +; *** "Select Destination Directory" wizard page +WizardUserInfo=Kyttjtiedot +UserInfoDesc=Anna pyydetyt tiedot. +UserInfoName=Kyttjn &nimi: +UserInfoOrg=&Yritys: +UserInfoSerial=&Tunnuskoodi: +UserInfoNameRequired=Sinun tytyy antaa nimi. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Valitse kohdekansio +SelectDirDesc=Mihin [name] asennetaan? +SelectDirLabel3=[name] asennetaan thn kansioon. +SelectDirBrowseLabel=Valitse Seuraava jatkaaksesi. Jos haluat vaihtaa kansiota, valitse Selaa. +DiskSpaceGBLabel=Vapaata levytilaa tarvitaan vhintn [gb] Gt. +DiskSpaceMBLabel=Vapaata levytilaa tarvitaan vhintn [mb] Mt. +CannotInstallToNetworkDrive=Asennus ei voi asentaa ohjelmaa verkkoasemalle. +CannotInstallToUNCPath=Asennus ei voi asentaa ohjelmaa UNC-polun alle. +InvalidPath=Anna tydellinen polku levyaseman kirjaimen kanssa. Esimerkiksi %nC:\OHJELMA%n%ntai UNC-polku muodossa %n%n\\palvelin\resurssi +InvalidDrive=Valitsemaasi asemaa tai UNC-polkua ei ole olemassa tai sit ei voi kytt. Valitse toinen asema tai UNC-polku. +DiskSpaceWarningTitle=Ei tarpeeksi vapaata levytilaa +DiskSpaceWarning=Asennus vaatii vhintn %1 kt vapaata levytilaa, mutta valitulla levyasemalla on vain %2 kt vapaata levytilaa.%n%nHaluatko jatkaa tst huolimatta? +DirNameTooLong=Kansion nimi tai polku on liian pitk. +InvalidDirName=Virheellinen kansion nimi. +BadDirName32=Kansion nimess ei saa olla seuraavia merkkej:%n%n%1 +DirExistsTitle=Kansio on olemassa +DirExists=Kansio:%n%n%1%n%non jo olemassa. Haluatko kuitenkin suorittaa asennuksen thn kansioon? +DirDoesntExistTitle=Kansiota ei ole olemassa +DirDoesntExist=Kansiota%n%n%1%n%nei ole olemassa. Luodaanko kansio? + +; *** "Select Components" wizard page +WizardSelectComponents=Valitse asennettavat osat +SelectComponentsDesc=Mitk osat asennetaan? +SelectComponentsLabel2=Valitse ne osat, jotka haluat asentaa, ja poista niiden osien valinta, joita et halua asentaa. Valitse Seuraava, kun olet valmis. +FullInstallation=Normaali asennus +CompactInstallation=Suppea asennus +CustomInstallation=Mukautettu asennus +NoUninstallWarningTitle=Asennettuja osia lydettiin +NoUninstallWarning=Seuraavat osat on jo asennettu koneelle:%n%n%1%n%nNiden osien valinnan poistaminen ei poista niit koneelta.%n%nHaluatko jatkaa tst huolimatta? +ComponentSize1=%1 kt +ComponentSize2=%1 Mt +ComponentsDiskSpaceGBLabel=Nykyiset valinnat vaativat vhintn [gb] Gt levytilaa. +ComponentsDiskSpaceMBLabel=Nykyiset valinnat vaativat vhintn [mb] Mt levytilaa. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Valitse muut toiminnot +SelectTasksDesc=Mit muita toimintoja suoritetaan? +SelectTasksLabel2=Valitse muut toiminnot, jotka haluat Asennuksen suorittavan samalla kun [name] asennetaan. Valitse Seuraava, kun olet valmis. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Valitse Kynnist-valikon kansio +SelectStartMenuFolderDesc=Mihin ohjelman pikakuvakkeet sijoitetaan? +SelectStartMenuFolderLabel3=Ohjelman pikakuvakkeet luodaan thn Kynnist-valikon kansioon. +SelectStartMenuFolderBrowseLabel=Valitse Seuraava jatkaaksesi. Jos haluat vaihtaa kansiota, valitse Selaa. +MustEnterGroupName=Kansiolle pit antaa nimi. +GroupNameTooLong=Kansion nimi tai polku on liian pitk. +InvalidGroupName=Virheellinen kansion nimi. +BadGroupName=Kansion nimess ei saa olla seuraavia merkkej:%n%n%1 +NoProgramGroupCheck2=l luo k&ansiota Kynnist-valikkoon + +; *** "Ready to Install" wizard page +WizardReady=Valmiina asennukseen +ReadyLabel1=[name] on nyt valmis asennettavaksi. +ReadyLabel2a=Valitse Asenna jatkaaksesi asentamista tai valitse Takaisin, jos haluat tarkastella tekemisi asetuksia tai muuttaa niit. +ReadyLabel2b=Valitse Asenna jatkaaksesi asentamista. +ReadyMemoUserInfo=Kyttjtiedot: +ReadyMemoDir=Kohdekansio: +ReadyMemoType=Asennustyyppi: +ReadyMemoComponents=Asennettavaksi valitut osat: +ReadyMemoGroup=Kynnist-valikon kansio: +ReadyMemoTasks=Muut toiminnot: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Ladataan tarvittavia tiedostoja... +ButtonStopDownload=&Pysyt lataus +StopDownload=Oletko varma, ett haluat pysytt tiedostojen latauksen? +ErrorDownloadAborted=Tiedostojen lataaminen keskeytettiin +ErrorDownloadFailed=Tiedoston lataaminen eponnistui: %1 %2 +ErrorDownloadSizeFailed=Latauksen koon noutaminen eponnistui: %1 %2 +ErrorFileHash1=Tiedoston tiivisteen luominen eponnistui: %1 +ErrorFileHash2=Tiedoston tiiviste on virheellinen: odotettu %1, lydetty %2 +ErrorProgress=Virheellinen edistyminen: %1 / %2 +ErrorFileSize=Virheellinen tiedoston koko: odotettu %1, lydetty %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Valmistellaan asennusta +PreparingDesc=Valmistaudutaan asentamaan [name] koneellesi. +PreviousInstallNotCompleted=Edellisen ohjelman asennus tai asennuksen poisto ei ole valmis. Sinun tytyy kynnist kone uudelleen viimeistellksesi edellisen asennuksen.%n%nAja [name] -asennusohjelma uudestaan, kun olet kynnistnyt koneen uudelleen. +CannotContinue=Asennusta ei voida jatkaa. Valitse Peruuta poistuaksesi. +ApplicationsFound=Seuraavat sovellukset kyttvt tiedostoja, joita Asennuksen pit pivitt. On suositeltavaa, ett annat Asennuksen sulkea nm sovellukset automaattisesti. +ApplicationsFound2=Seuraavat sovellukset kyttvt tiedostoja, joita Asennuksen pit pivitt. On suositeltavaa, ett annat Asennuksen sulkea nm sovellukset automaattisesti. Valmistumisen jlkeen Asennus yritt uudelleenkynnist sovellukset. +CloseApplications=&Sulje sovellukset automaattisesti +DontCloseApplications=&l sulje sovelluksia +ErrorCloseApplications=Asennus ei pystynyt sulkemaan tarvittavia sovelluksia automaattisesti. On suositeltavaa, ett ennen jatkamista suljet sovellukset, jotka kyttvt asennuksen aikana pivitettvi tiedostoja. +PrepareToInstallNeedsRestart=Asennuksen tytyy kynnist tietokone uudelleen. Aja Asennus uudelleenkynnistyksen jlkeen, jotta [name] voidaan asentaa.%n%nHaluatko kynnist tietokoneen uudelleen nyt? + +; *** "Installing" wizard page +WizardInstalling=Asennus kynniss +InstallingLabel=Odota, kun [name] asennetaan koneellesi. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=[name] - Asennuksen viimeistely +FinishedLabelNoIcons=[name] on nyt asennettu koneellesi. +FinishedLabel=[name] on nyt asennettu. Sovellus voidaan kynnist valitsemalla jokin asennetuista kuvakkeista. +ClickFinish=Valitse Lopeta poistuaksesi Asennuksesta. +FinishedRestartLabel=Jotta [name] saataisiin asennettua loppuun, pit kone kynnist uudelleen. Haluatko kynnist koneen uudelleen nyt? +FinishedRestartMessage=Jotta [name] saataisiin asennettua loppuun, pit kone kynnist uudelleen.%n%nHaluatko kynnist koneen uudelleen nyt? +ShowReadmeCheck=Kyll, haluan nhd LUEMINUT-tiedoston +YesRadio=&Kyll, kynnist kone uudelleen +NoRadio=&Ei, kynnistn koneen uudelleen myhemmin +RunEntryExec=Kynnist %1 +RunEntryShellExec=Nyt %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Asennus tarvitsee seuraavan levykkeen +SelectDiskLabel2=Aseta levyke %1 asemaan ja valitse OK. %n%nJos joku toinen kansio sislt levykkeen tiedostot, anna oikea polku tai valitse Selaa. +PathLabel=&Polku: +FileNotInDir2=Tiedostoa "%1" ei lytynyt lhteest "%2". Aseta oikea levyke asemaan tai valitse toinen kansio. +SelectDirectoryLabel=Mrit seuraavan levykkeen sislln sijainti. + +; *** Installation phase messages +SetupAborted=Asennusta ei suoritettu loppuun.%n%nKorjaa ongelma ja suorita Asennus uudelleen. +AbortRetryIgnoreSelectAction=Valitse toiminto +AbortRetryIgnoreRetry=&Yrit uudelleen +AbortRetryIgnoreIgnore=&Jatka virheest huolimatta +AbortRetryIgnoreCancel=Peruuta asennus + +; *** Installation status messages +StatusClosingApplications=Suljetaan sovellukset... +StatusCreateDirs=Luodaan hakemistoja... +StatusExtractFiles=Puretaan tiedostoja... +StatusCreateIcons=Luodaan pikakuvakkeita... +StatusCreateIniEntries=Luodaan INI-merkintj... +StatusCreateRegistryEntries=Luodaan rekisterimerkintj... +StatusRegisterFiles=Rekisteridn tiedostoja... +StatusSavingUninstall=Tallennetaan Asennuksen poiston tietoja... +StatusRunProgram=Viimeistelln asennusta... +StatusRestartingApplications=Uudelleenkynnistetn sovellukset... +StatusRollback=Peruutetaan tehdyt muutokset... + +; *** Misc. errors +ErrorInternal2=Sisinen virhe: %1 +ErrorFunctionFailedNoCode=%1 eponnistui +ErrorFunctionFailed=%1 eponnistui; virhekoodi %2 +ErrorFunctionFailedWithMessage=%1 eponnistui; virhekoodi %2.%n%3 +ErrorExecutingProgram=Virhe suoritettaessa tiedostoa%n%1 + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Asennetaan %1. +ShutdownBlockReasonUninstallingApp=Poistetaan %1. + +; *** Registry errors +ErrorRegOpenKey=Virhe avattaessa rekisteriavainta%n%1\%2 +ErrorRegCreateKey=Virhe luotaessa rekisteriavainta%n%1\%2 +ErrorRegWriteKey=Virhe kirjoitettaessa rekisteriavaimeen%n%1\%2 + +; *** INI errors +ErrorIniEntry=Virhe luotaessa INI-merkint tiedostoon "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Ohita tm tiedosto (ei suositeltavaa) +FileAbortRetryIgnoreIgnoreNotRecommended=&Jatka virheest huolimatta (ei suositeltavaa) +SourceIsCorrupted=Lhdetiedosto on vaurioitunut +SourceDoesntExist=Lhdetiedostoa "%1" ei ole olemassa +ExistingFileReadOnly2=Nykyist tiedostoa ei voitu korvata, koska se on Vain luku -tiedosto. +ExistingFileReadOnlyRetry=&Poista Vain luku -asetus ja yrit uudelleen +ExistingFileReadOnlyKeepExisting=&Silyt nykyinen tiedosto +ErrorReadingExistingDest=Virhe luettaessa nykyist tiedostoa: +FileExistsSelectAction=Valitse toiminto +FileExists2=Tiedosto on jo olemassa. +FileExistsOverwriteExisting=Korvaa &olemassa oleva tiedosto +FileExistsKeepExisting=&Silyt olemassa oleva tiedosto +FileExistsOverwriteOrKeepAll=&Hoida muut vastaavat tilanteet samalla tavalla +ExistingFileNewerSelectAction=Valitse toiminto +ExistingFileNewer2=Olemassa oleva tiedosto on uudempi kuin Asennuksen sisltm tiedosto. +ExistingFileNewerOverwriteExisting=Korvaa &olemassa oleva tiedosto +ExistingFileNewerKeepExisting=&Silyt olemassa oleva tiedosto (suositeltavaa) +ExistingFileNewerOverwriteOrKeepAll=&Hoida muut vastaavat tilanteet samalla tavalla +ErrorChangingAttr=Virhe vaihdettaessa nykyisen tiedoston mritteit: +ErrorCreatingTemp=Virhe luotaessa tiedostoa kohdehakemistoon: +ErrorReadingSource=Virhe luettaessa lhdetiedostoa: +ErrorCopying=Virhe kopioitaessa tiedostoa: +ErrorReplacingExistingFile=Virhe korvattaessa nykyist tiedostoa: +ErrorRestartReplace=RestartReplace-komento eponnistui: +ErrorRenamingTemp=Virhe uudelleennimettess tiedostoa kohdehakemistossa: +ErrorRegisterServer=DLL/OCX -laajennuksen rekisterinti eponnistui: %1 +ErrorRegSvr32Failed=RegSvr32-toiminto eponnistui. Virhekoodi: %1 +ErrorRegisterTypeLib=Tyyppikirjaston rekisteriminen eponnistui: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bittinen +UninstallDisplayNameMark64Bit=64-bittinen +UninstallDisplayNameMarkAllUsers=Kaikki kyttjt +UninstallDisplayNameMarkCurrentUser=Tmnhetkinen kyttj + +; *** Post-installation errors +ErrorOpeningReadme=Virhe avattaessa LUEMINUT-tiedostoa. +ErrorRestartingComputer=Koneen uudelleenkynnistminen ei onnistunut. Suorita uudelleenkynnistys itse. + +; *** Uninstaller messages +UninstallNotFound=Tiedostoa "%1" ei lytynyt. Asennuksen poisto ei onnistu. +UninstallOpenError=Tiedostoa "%1" ei voitu avata. Asennuksen poisto ei onnistu. +UninstallUnsupportedVer=Tm versio Asennuksen poisto-ohjelmasta ei pysty lukemaan lokitiedostoa "%1". Asennuksen poisto ei onnistu +UninstallUnknownEntry=Asennuksen poisto-ohjelman lokitiedostosta lytyi tuntematon merkint (%1) +ConfirmUninstall=Poistetaanko %1 ja kaikki sen osat? +UninstallOnlyOnWin64=Tm ohjelma voidaan poistaa vain 64-bittisest Windowsista ksin. +OnlyAdminCanUninstall=Tmn asennuksen poistaminen vaatii jrjestelmnvalvojan oikeudet. +UninstallStatusLabel=Odota, kun %1 poistetaan koneeltasi. +UninstalledAll=%1 poistettiin onnistuneesti. +UninstalledMost=%1 poistettiin koneelta.%n%nJoitakin osia ei voitu poistaa. Voit poistaa osat itse. +UninstalledAndNeedsRestart=Kone tytyy kynnist uudelleen, jotta %1 voidaan poistaa kokonaan.%n%nHaluatko kynnist koneen uudeelleen nyt? +UninstallDataCorrupted=Tiedosto "%1" on vaurioitunut. Asennuksen poisto ei onnistu. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Poistetaanko jaettu tiedosto? +ConfirmDeleteSharedFile2=Jrjestelmn mukaan seuraava jaettu tiedosto ei ole en minkn muun sovelluksen kytss. Poistetaanko tiedosto?%n%nJos jotkut sovellukset kyttvt viel tt tiedostoa ja se poistetaan, ne eivt vlttmtt toimi en kunnolla. Jos olet epvarma, valitse Ei. Tiedoston jttminen koneelle ei aiheuta ongelmia. +SharedFileNameLabel=Tiedoston nimi: +SharedFileLocationLabel=Sijainti: +WizardUninstalling=Asennuksen poiston tila +StatusUninstalling=Poistetaan %1... + +[CustomMessages] + +NameAndVersion=%1 versio %2 +AdditionalIcons=Liskuvakkeet: +CreateDesktopIcon=Lu&o kuvake typydlle +CreateQuickLaunchIcon=Luo kuvake &pikakynnistyspalkkiin +ProgramOnTheWeb=%1 Internetiss +UninstallProgram=Poista %1 +LaunchProgram=&Kynnist %1 +AssocFileExtension=&Yhdist %1 tiedostoptteeseen %2 +AssocingFileExtension=Yhdistetn %1 tiedostoptteeseen %2 ... +AutoStartProgramGroupDescription=Kynnistys: +AutoStartProgram=Kynnist %1 automaattisesti +AddonHostProgramNotFound=%1 ei ole valitsemassasi kansiossa.%n%nHaluatko jatkaa tst huolimatta? diff --git a/installer/innosetup/Languages/French.isl b/installer/innosetup/Languages/French.isl new file mode 100644 index 000000000..7c8db9232 --- /dev/null +++ b/installer/innosetup/Languages/French.isl @@ -0,0 +1,404 @@ +; *** Inno Setup version 6.1.0+ French messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Maintained by Pierre Yager (pierre@levosgien.net) +; +; Contributors : Frédéric Bonduelle, Francis Pallini, Lumina, Pascal Peyrot +; +; Changes : +; + Accents on uppercase letters +; http://www.academie-francaise.fr/langue/questions.html#accentuation (lumina) +; + Typography quotes [see ISBN: 978-2-7433-0482-9] +; http://fr.wikipedia.org/wiki/Guillemet (lumina) +; + Binary units (Kio, Mio) [IEC 80000-13:2008] +; http://fr.wikipedia.org/wiki/Octet (lumina) +; + Reverted to standard units (Ko, Mo) to follow Windows Explorer Standard +; http://blogs.msdn.com/b/oldnewthing/archive/2009/06/11/9725386.aspx +; + Use more standard verbs for click and retry +; "click": "Clicker" instead of "Appuyer" +; "retry": "Recommencer" au lieu de "Réessayer" +; + Added new 6.0.0 messages +; + Added new 6.1.0 messages + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Français +LanguageID=$040C +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Installation +SetupWindowTitle=Installation - %1 +UninstallAppTitle=Désinstallation +UninstallAppFullTitle=Désinstallation - %1 + +; *** Misc. common +InformationTitle=Information +ConfirmTitle=Confirmation +ErrorTitle=Erreur + +; *** SetupLdr messages +SetupLdrStartupMessage=Cet assistant va installer %1. Voulez-vous continuer ? +LdrCannotCreateTemp=Impossible de créer un fichier temporaire. Abandon de l'installation +LdrCannotExecTemp=Impossible d'exécuter un fichier depuis le dossier temporaire. Abandon de l'installation +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nErreur %2 : %3 +SetupFileMissing=Le fichier %1 est absent du dossier d'installation. Veuillez corriger le problème ou vous procurer une nouvelle copie du programme. +SetupFileCorrupt=Les fichiers d'installation sont altérés. Veuillez vous procurer une nouvelle copie du programme. +SetupFileCorruptOrWrongVer=Les fichiers d'installation sont altérés ou ne sont pas compatibles avec cette version de l'assistant d'installation. Veuillez corriger le problème ou vous procurer une nouvelle copie du programme. +InvalidParameter=Un paramètre non valide a été passé à la ligne de commande :%n%n%1 +SetupAlreadyRunning=L'assistant d'installation est déjà en cours d'exécution. +WindowsVersionNotSupported=Ce programme n'est pas prévu pour fonctionner avec la version de Windows utilisée sur votre ordinateur. +WindowsServicePackRequired=Ce programme a besoin de %1 Service Pack %2 ou d'une version plus récente. +NotOnThisPlatform=Ce programme ne fonctionne pas sous %1. +OnlyOnThisPlatform=Ce programme ne peut fonctionner que sous %1. +OnlyOnTheseArchitectures=Ce programme ne peut être installé que sur des versions de Windows qui supportent ces architectures : %n%n%1 +WinVersionTooLowError=Ce programme requiert la version %2 ou supérieure de %1. +WinVersionTooHighError=Ce programme ne peut pas être installé sous %1 version %2 ou supérieure. +AdminPrivilegesRequired=Vous devez disposer des droits d'administration de cet ordinateur pour installer ce programme. +PowerUserPrivilegesRequired=Vous devez disposer des droits d'administration ou faire partie du groupe « Utilisateurs avec pouvoir » de cet ordinateur pour installer ce programme. +SetupAppRunningError=L'assistant d'installation a détecté que %1 est actuellement en cours d'exécution.%n%nVeuillez fermer toutes les instances de cette application puis cliquer sur OK pour continuer, ou bien cliquer sur Annuler pour abandonner l'installation. +UninstallAppRunningError=La procédure de désinstallation a détecté que %1 est actuellement en cours d'exécution.%n%nVeuillez fermer toutes les instances de cette application puis cliquer sur OK pour continuer, ou bien cliquer sur Annuler pour abandonner la désinstallation. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Choix du Mode d'Installation +PrivilegesRequiredOverrideInstruction=Choisissez le mode d'installation +PrivilegesRequiredOverrideText1=%1 peut être installé pour tous les utilisateurs (nécessite des privilèges administrateur), ou seulement pour vous. +PrivilegesRequiredOverrideText2=%1 peut-être installé seulement pour vous, ou pour tous les utilisateurs (nécessite des privilèges administrateur). +PrivilegesRequiredOverrideAllUsers=Installer pour &tous les utilisateurs +PrivilegesRequiredOverrideAllUsersRecommended=Installer pour &tous les utilisateurs (recommandé) +PrivilegesRequiredOverrideCurrentUser=Installer seulement pour &moi +PrivilegesRequiredOverrideCurrentUserRecommended=Installer seulement pour &moi (recommandé) + +; *** Misc. errors +ErrorCreatingDir=L'assistant d'installation n'a pas pu créer le dossier "%1" +ErrorTooManyFilesInDir=L'assistant d'installation n'a pas pu créer un fichier dans le dossier "%1" car celui-ci contient trop de fichiers + +; *** Setup common messages +ExitSetupTitle=Quitter l'installation +ExitSetupMessage=L'installation n'est pas terminée. Si vous abandonnez maintenant, le programme ne sera pas installé.%n%nVous devrez relancer cet assistant pour finir l'installation.%n%nVoulez-vous quand même quitter l'assistant d'installation ? +AboutSetupMenuItem=À &propos... +AboutSetupTitle=À Propos de l'assistant d'installation +AboutSetupMessage=%1 version %2%n%3%n%nPage d'accueil de %1 :%n%4 +AboutSetupNote= +TranslatorNote=Traduction française maintenue par Pierre Yager (pierre@levosgien.net) + +; *** Buttons +ButtonBack=< &Précédent +ButtonNext=&Suivant > +ButtonInstall=&Installer +ButtonOK=OK +ButtonCancel=Annuler +ButtonYes=&Oui +ButtonYesToAll=Oui pour &tout +ButtonNo=&Non +ButtonNoToAll=N&on pour tout +ButtonFinish=&Terminer +ButtonBrowse=Pa&rcourir... +ButtonWizardBrowse=Pa&rcourir... +ButtonNewFolder=Nouveau &dossier + +; *** "Select Language" dialog messages +SelectLanguageTitle=Langue de l'assistant d'installation +SelectLanguageLabel=Veuillez sélectionner la langue qui sera utilisée par l'assistant d'installation. + +; *** Common wizard text +ClickNext=Cliquez sur Suivant pour continuer ou sur Annuler pour abandonner l'installation. +BeveledLabel= +BrowseDialogTitle=Parcourir les dossiers +BrowseDialogLabel=Veuillez choisir un dossier de destination, puis cliquez sur OK. +NewFolderName=Nouveau dossier + +; *** "Welcome" wizard page +WelcomeLabel1=Bienvenue dans l'assistant d'installation de [name] +WelcomeLabel2=Cet assistant va vous guider dans l'installation de [name/ver] sur votre ordinateur.%n%nIl est recommandé de fermer toutes les applications actives avant de continuer. + +; *** "Password" wizard page +WizardPassword=Mot de passe +PasswordLabel1=Cette installation est protégée par un mot de passe. +PasswordLabel3=Veuillez saisir le mot de passe (attention à la distinction entre majuscules et minuscules) puis cliquez sur Suivant pour continuer. +PasswordEditLabel=&Mot de passe : +IncorrectPassword=Le mot de passe saisi n'est pas valide. Veuillez essayer à nouveau. + +; *** "License Agreement" wizard page +WizardLicense=Accord de licence +LicenseLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. +LicenseLabel3=Veuillez lire le contrat de licence suivant. Vous devez en accepter tous les termes avant de continuer l'installation. +LicenseAccepted=Je comprends et j'&accepte les termes du contrat de licence +LicenseNotAccepted=Je &refuse les termes du contrat de licence + +; *** "Information" wizard pages +WizardInfoBefore=Information +InfoBeforeLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. +InfoBeforeClickLabel=Lorsque vous êtes prêt à continuer, cliquez sur Suivant. +WizardInfoAfter=Information +InfoAfterLabel=Les informations suivantes sont importantes. Veuillez les lire avant de continuer. +InfoAfterClickLabel=Lorsque vous êtes prêt à continuer, cliquez sur Suivant. + +; *** "User Information" wizard page +WizardUserInfo=Informations sur l'Utilisateur +UserInfoDesc=Veuillez saisir les informations qui vous concernent. +UserInfoName=&Nom d'utilisateur : +UserInfoOrg=&Organisation : +UserInfoSerial=Numéro de &série : +UserInfoNameRequired=Vous devez au moins saisir un nom. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Dossier de destination +SelectDirDesc=Où [name] doit-il être installé ? +SelectDirLabel3=L'assistant va installer [name] dans le dossier suivant. +SelectDirBrowseLabel=Pour continuer, cliquez sur Suivant. Si vous souhaitez choisir un dossier différent, cliquez sur Parcourir. +DiskSpaceGBLabel=Le programme requiert au moins [gb] Go d'espace disque disponible. +DiskSpaceMBLabel=Le programme requiert au moins [mb] Mo d'espace disque disponible. +CannotInstallToNetworkDrive=L'assistant ne peut pas installer sur un disque réseau. +CannotInstallToUNCPath=L'assistant ne peut pas installer sur un chemin UNC. +InvalidPath=Vous devez saisir un chemin complet avec sa lettre de lecteur ; par exemple :%n%nC:\APP%n%nou un chemin réseau de la forme :%n%n\\serveur\partage +InvalidDrive=L'unité ou l'emplacement réseau que vous avez sélectionné n'existe pas ou n'est pas accessible. Veuillez choisir une autre destination. +DiskSpaceWarningTitle=Espace disponible insuffisant +DiskSpaceWarning=L'assistant a besoin d'au moins %1 Ko d'espace disponible pour effectuer l'installation, mais l'unité que vous avez sélectionnée ne dispose que de %2 Ko d'espace disponible.%n%nSouhaitez-vous continuer malgré tout ? +DirNameTooLong=Le nom ou le chemin du dossier est trop long. +InvalidDirName=Le nom du dossier est invalide. +BadDirName32=Le nom du dossier ne doit contenir aucun des caractères suivants :%n%n%1 +DirExistsTitle=Dossier existant +DirExists=Le dossier :%n%n%1%n%nexiste déjà. Souhaitez-vous installer dans ce dossier malgré tout ? +DirDoesntExistTitle=Le dossier n'existe pas +DirDoesntExist=Le dossier %n%n%1%n%nn'existe pas. Souhaitez-vous que ce dossier soit créé ? + +; *** "Select Components" wizard page +WizardSelectComponents=Composants à installer +SelectComponentsDesc=Quels composants de l'application souhaitez-vous installer ? +SelectComponentsLabel2=Sélectionnez les composants que vous désirez installer ; décochez les composants que vous ne désirez pas installer. Cliquez ensuite sur Suivant pour continuer l'installation. +FullInstallation=Installation complète +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Installation compacte +CustomInstallation=Installation personnalisée +NoUninstallWarningTitle=Composants existants +NoUninstallWarning=L'assistant d'installation a détecté que les composants suivants sont déjà installés sur votre système :%n%n%1%n%nDésélectionner ces composants ne les désinstallera pas pour autant.%n%nVoulez-vous continuer malgré tout ? +ComponentSize1=%1 Ko +ComponentSize2=%1 Mo +ComponentsDiskSpaceGBLabel=Les composants sélectionnés nécessitent au moins [gb] Go d'espace disponible. +ComponentsDiskSpaceMBLabel=Les composants sélectionnés nécessitent au moins [mb] Mo d'espace disponible. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Tâches supplémentaires +SelectTasksDesc=Quelles sont les tâches supplémentaires qui doivent être effectuées ? +SelectTasksLabel2=Sélectionnez les tâches supplémentaires que l'assistant d'installation doit effectuer pendant l'installation de [name], puis cliquez sur Suivant. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Sélection du dossier du menu Démarrer +SelectStartMenuFolderDesc=Où l'assistant d'installation doit-il placer les raccourcis du programme ? +SelectStartMenuFolderLabel3=L'assistant va créer les raccourcis du programme dans le dossier du menu Démarrer indiqué ci-dessous. +SelectStartMenuFolderBrowseLabel=Cliquez sur Suivant pour continuer. Cliquez sur Parcourir si vous souhaitez sélectionner un autre dossier du menu Démarrer. +MustEnterGroupName=Vous devez saisir un nom de dossier du menu Démarrer. +GroupNameTooLong=Le nom ou le chemin du dossier est trop long. +InvalidGroupName=Le nom du dossier n'est pas valide. +BadGroupName=Le nom du dossier ne doit contenir aucun des caractères suivants :%n%n%1 +NoProgramGroupCheck2=Ne pas créer de &dossier dans le menu Démarrer + +; *** "Ready to Install" wizard page +WizardReady=Prêt à installer +ReadyLabel1=L'assistant dispose à présent de toutes les informations pour installer [name] sur votre ordinateur. +ReadyLabel2a=Cliquez sur Installer pour procéder à l'installation ou sur Précédent pour revoir ou modifier une option d'installation. +ReadyLabel2b=Cliquez sur Installer pour procéder à l'installation. +ReadyMemoUserInfo=Informations sur l'utilisateur : +ReadyMemoDir=Dossier de destination : +ReadyMemoType=Type d'installation : +ReadyMemoComponents=Composants sélectionnés : +ReadyMemoGroup=Dossier du menu Démarrer : +ReadyMemoTasks=Tâches supplémentaires : + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Téléchargement de fichiers supplémentaires... +ButtonStopDownload=&Arrêter le téléchargement +StopDownload=Êtes-vous sûr de vouloir arrêter le téléchargement ? +ErrorDownloadAborted=Téléchargement annulé +ErrorDownloadFailed=Le téléchargement a échoué : %1 %2 +ErrorDownloadSizeFailed=La récupération de la taille du fichier a échouée : %1 %2 +ErrorFileHash1=Le calcul de l'empreinte du fichier a échoué : %1 +ErrorFileHash2=Empreinte du fichier invalide : attendue %1, trouvée %2 +ErrorProgress=Progression invalide : %1 sur %2 +ErrorFileSize=Taille du fichier invalide : attendue %1, trouvée %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Préparation de l'installation +PreparingDesc=L'assistant d'installation prépare l'installation de [name] sur votre ordinateur. +PreviousInstallNotCompleted=L'installation ou la suppression d'un programme précédent n'est pas totalement achevée. Veuillez redémarrer votre ordinateur pour achever cette installation ou suppression.%n%nUne fois votre ordinateur redémarré, veuillez relancer cet assistant pour reprendre l'installation de [name]. +CannotContinue=L'assistant ne peut pas continuer. Veuillez cliquer sur Annuler pour abandonner l'installation. +ApplicationsFound=Les applications suivantes utilisent des fichiers qui doivent être mis à jour par l'assistant. Il est recommandé d'autoriser l'assistant à fermer ces applications automatiquement. +ApplicationsFound2=Les applications suivantes utilisent des fichiers qui doivent être mis à jour par l'assistant. Il est recommandé d'autoriser l'assistant à fermer ces applications automatiquement. Une fois l'installation terminée, l'assistant essaiera de relancer ces applications. +CloseApplications=&Arrêter les applications automatiquement +DontCloseApplications=&Ne pas arrêter les applications +ErrorCloseApplications=L'assistant d'installation n'a pas pu arrêter toutes les applications automatiquement. Nous vous recommandons de fermer toutes les applications qui utilisent des fichiers devant être mis à jour par l'assistant d'installation avant de continuer. +PrepareToInstallNeedsRestart=L'assistant d'installation doit redémarrer votre ordinateur. Une fois votre ordinateur redémarré, veuillez relancer cet assistant d'installation pour terminer l'installation de [name].%n%nVoulez-vous redémarrer votre ordinateur maintenant ? + +; *** "Installing" wizard page +WizardInstalling=Installation en cours +InstallingLabel=Veuillez patienter pendant que l'assistant installe [name] sur votre ordinateur. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Fin de l'installation de [name] +FinishedLabelNoIcons=L'assistant a terminé l'installation de [name] sur votre ordinateur. +FinishedLabel=L'assistant a terminé l'installation de [name] sur votre ordinateur. L'application peut être lancée à l'aide des icônes créées sur le Bureau par l'installation. +ClickFinish=Veuillez cliquer sur Terminer pour quitter l'assistant d'installation. +FinishedRestartLabel=L'assistant doit redémarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redémarrer maintenant ? +FinishedRestartMessage=L'assistant doit redémarrer votre ordinateur pour terminer l'installation de [name].%n%nVoulez-vous redémarrer maintenant ? +ShowReadmeCheck=Oui, je souhaite lire le fichier LISEZMOI +YesRadio=&Oui, redémarrer mon ordinateur maintenant +NoRadio=&Non, je préfère redémarrer mon ordinateur plus tard +; used for example as 'Run MyProg.exe' +RunEntryExec=Exécuter %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Voir %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=L'assistant a besoin du disque suivant +SelectDiskLabel2=Veuillez insérer le disque %1 et cliquer sur OK.%n%nSi les fichiers de ce disque se trouvent à un emplacement différent de celui indiqué ci-dessous, veuillez saisir le chemin correspondant ou cliquez sur Parcourir. +PathLabel=&Chemin : +FileNotInDir2=Le fichier "%1" ne peut pas être trouvé dans "%2". Veuillez insérer le bon disque ou sélectionner un autre dossier. +SelectDirectoryLabel=Veuillez indiquer l'emplacement du disque suivant. + +; *** Installation phase messages +SetupAborted=L'installation n'est pas terminée.%n%nVeuillez corriger le problème et relancer l'installation. +AbortRetryIgnoreSelectAction=Choisissez une action +AbortRetryIgnoreRetry=&Recommencer +AbortRetryIgnoreIgnore=&Ignorer l'erreur et continuer +AbortRetryIgnoreCancel=Annuler l'installation + +; *** Installation status messages +StatusClosingApplications=Ferme les applications... +StatusCreateDirs=Création des dossiers... +StatusExtractFiles=Extraction des fichiers... +StatusCreateIcons=Création des raccourcis... +StatusCreateIniEntries=Création des entrées du fichier INI... +StatusCreateRegistryEntries=Création des entrées de registre... +StatusRegisterFiles=Enregistrement des fichiers... +StatusSavingUninstall=Sauvegarde des informations de désinstallation... +StatusRunProgram=Finalisation de l'installation... +StatusRestartingApplications=Relance les applications... +StatusRollback=Annulation des modifications... + +; *** Misc. errors +ErrorInternal2=Erreur interne : %1 +ErrorFunctionFailedNoCode=%1 a échoué +ErrorFunctionFailed=%1 a échoué ; code %2 +ErrorFunctionFailedWithMessage=%1 a échoué ; code %2.%n%3 +ErrorExecutingProgram=Impossible d'exécuter le fichier :%n%1 + +; *** Registry errors +ErrorRegOpenKey=Erreur lors de l'ouverture de la clé de registre :%n%1\%2 +ErrorRegCreateKey=Erreur lors de la création de la clé de registre :%n%1\%2 +ErrorRegWriteKey=Erreur lors de l'écriture de la clé de registre :%n%1\%2 + +; *** INI errors +ErrorIniEntry=Erreur d'écriture d'une entrée dans le fichier INI "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Ignorer ce fichier (non recommandé) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorer l'erreur et continuer (non recommandé) +SourceIsCorrupted=Le fichier source est altéré +SourceDoesntExist=Le fichier source "%1" n'existe pas +ExistingFileReadOnly2=Le fichier existant ne peut pas être remplacé parce qu'il est protégé par l'attribut lecture seule. +ExistingFileReadOnlyRetry=&Supprimer l'attribut lecture seule et réessayer +ExistingFileReadOnlyKeepExisting=&Conserver le fichier existant +ErrorReadingExistingDest=Une erreur s'est produite lors de la tentative de lecture du fichier existant : +FileExistsSelectAction=Choisissez une action +FileExists2=Le fichier existe déjà. +FileExistsOverwriteExisting=&Ecraser le fichier existant +FileExistsKeepExisting=&Conserver le fichier existant +FileExistsOverwriteOrKeepAll=&Faire ceci pour les conflits à venir +ExistingFileNewerSelectAction=Choisissez une action +ExistingFileNewer2=Le fichier existant est plus récent que celui que l'assistant d'installation est en train d'installer. +ExistingFileNewerOverwriteExisting=&Ecraser le fichier existant +ExistingFileNewerKeepExisting=&Conserver le fichier existant (recommandé) +ExistingFileNewerOverwriteOrKeepAll=&Faire ceci pour les conflits à venir +ErrorChangingAttr=Une erreur est survenue en essayant de modifier les attributs du fichier existant : +ErrorCreatingTemp=Une erreur est survenue en essayant de créer un fichier dans le dossier de destination : +ErrorReadingSource=Une erreur est survenue lors de la lecture du fichier source : +ErrorCopying=Une erreur est survenue lors de la copie d'un fichier : +ErrorReplacingExistingFile=Une erreur est survenue lors du remplacement d'un fichier existant : +ErrorRestartReplace=Le marquage d'un fichier pour remplacement au redémarrage de l'ordinateur a échoué : +ErrorRenamingTemp=Une erreur est survenue en essayant de renommer un fichier dans le dossier de destination : +ErrorRegisterServer=Impossible d'enregistrer la bibliothèque DLL/OCX : %1 +ErrorRegSvr32Failed=RegSvr32 a échoué et a retourné le code d'erreur %1 +ErrorRegisterTypeLib=Impossible d'enregistrer la bibliothèque de type : %1 + +; *** Nom d'affichage pour la désinstallaton +; par exemple 'Mon Programme (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; ou par exemple 'Mon Programme (32-bit, Tous les utilisateurs)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Tous les utilisateurs +UninstallDisplayNameMarkCurrentUser=Utilisateur courant + +; *** Post-installation errors +ErrorOpeningReadme=Une erreur est survenue à l'ouverture du fichier LISEZMOI. +ErrorRestartingComputer=L'installation n'a pas pu redémarrer l'ordinateur. Merci de bien vouloir le faire vous-même. + +; *** Uninstaller messages +UninstallNotFound=Le fichier "%1" n'existe pas. Impossible de désinstaller. +UninstallOpenError=Le fichier "%1" n'a pas pu être ouvert. Impossible de désinstaller +UninstallUnsupportedVer=Le format du fichier journal de désinstallation "%1" n'est pas reconnu par cette version de la procédure de désinstallation. Impossible de désinstaller +UninstallUnknownEntry=Une entrée inconnue (%1) a été rencontrée dans le fichier journal de désinstallation +ConfirmUninstall=Voulez-vous vraiment désinstaller complètement %1 ainsi que tous ses composants ? +UninstallOnlyOnWin64=La désinstallation de ce programme ne fonctionne qu'avec une version 64 bits de Windows. +OnlyAdminCanUninstall=Ce programme ne peut être désinstallé que par un utilisateur disposant des droits d'administration. +UninstallStatusLabel=Veuillez patienter pendant que %1 est retiré de votre ordinateur. +UninstalledAll=%1 a été correctement désinstallé de cet ordinateur. +UninstalledMost=La désinstallation de %1 est terminée.%n%nCertains éléments n'ont pas pu être supprimés automatiquement. Vous pouvez les supprimer manuellement. +UninstalledAndNeedsRestart=Vous devez redémarrer l'ordinateur pour terminer la désinstallation de %1.%n%nVoulez-vous redémarrer maintenant ? +UninstallDataCorrupted=Le ficher "%1" est altéré. Impossible de désinstaller + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Supprimer les fichiers partagés ? +ConfirmDeleteSharedFile2=Le système indique que le fichier partagé suivant n'est plus utilisé par aucun programme. Souhaitez-vous que la désinstallation supprime ce fichier partagé ?%n%nSi des programmes utilisent encore ce fichier et qu'il est supprimé, ces programmes ne pourront plus fonctionner correctement. Si vous n'êtes pas sûr, choisissez Non. Laisser ce fichier dans votre système ne posera pas de problème. +SharedFileNameLabel=Nom du fichier : +SharedFileLocationLabel=Emplacement : +WizardUninstalling=État de la désinstallation +StatusUninstalling=Désinstallation de %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installe %1. +ShutdownBlockReasonUninstallingApp=Désinstalle %1. + +; Les messages personnalisés suivants ne sont pas utilisé par l'installation +; elle-même, mais si vous les utilisez dans vos scripts, vous devez les +; traduire + +[CustomMessages] + +NameAndVersion=%1 version %2 +AdditionalIcons=Icônes supplémentaires : +CreateDesktopIcon=Créer une icône sur le &Bureau +CreateQuickLaunchIcon=Créer une icône dans la barre de &Lancement rapide +ProgramOnTheWeb=Page d'accueil de %1 +UninstallProgram=Désinstaller %1 +LaunchProgram=Exécuter %1 +AssocFileExtension=&Associer %1 avec l'extension de fichier %2 +AssocingFileExtension=Associe %1 avec l'extension de fichier %2... +AutoStartProgramGroupDescription=Démarrage : +AutoStartProgram=Démarrer automatiquement %1 +AddonHostProgramNotFound=%1 n'a pas été trouvé dans le dossier que vous avez choisi.%n%nVoulez-vous continuer malgré tout ? diff --git a/installer/innosetup/Languages/Galician.isl b/installer/innosetup/Languages/Galician.isl index fab5215e4..5d7bfeb99 100644 --- a/installer/innosetup/Languages/Galician.isl +++ b/installer/innosetup/Languages/Galician.isl @@ -1,7 +1,10 @@ -; *** Inno Setup version 6.0.3+ Galician messages *** +; *** Inno Setup version 6.1.0+ Galician messages *** ; ; Maintained by: Julio Mojon Fuentes ; (juliomf AT edu.xunta.gal) +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ [LangOptions] LanguageName=Galego @@ -191,6 +194,18 @@ ReadyMemoComponents=Compoñentes seleccionados: ReadyMemoGroup=Cartafol do Menú Inicio: ReadyMemoTasks=Tarefas adicionais: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=A descargar arquivos adicionais... +ButtonStopDownload=&Deter descarga +StopDownload=Está seguro de que desexa deter a descarga? +ErrorDownloadAborted=Descarga cancelada +ErrorDownloadFailed=A descarga fallou: %1 %2 +ErrorDownloadSizeFailed=Non se puido determinar o tamaño: %1 %2 +ErrorFileHash1=Non se puido calcular o hash do arquivo: %1 +ErrorFileHash2=Hash do arquivo inválido: esperado %1, atopado %2 +ErrorProgress=Progreso inválido: %1 de %2 +ErrorFileSize=Tamaño de arquivo inválido: esperado %1, atopado %2 + ; *** "Preparing to Install" wizard page WizardPreparing=A prepararse para instalar PreparingDesc=O asistente de instalación está a prepararse para instalar [name] no seu computador. @@ -271,8 +286,16 @@ ExistingFileReadOnly2=Non foi posible substituír o arquivo existente porque est ExistingFileReadOnlyRetry=&Eliminar o atributo de só lectura e tentar de novo ExistingFileReadOnlyKeepExisting=&Manter o arquivo existente ErrorReadingExistingDest=Ocorreu un erro ao tentar ler o arquivo existente: -FileExists=O arquivo xa existe.%n%nDesexa que o asistente de instalación o sobrescriba? -ExistingFileNewer=O arquivo existente é máis novo ca o que o asistente de instalación tenta instalar. Recoméndaselle que manteña o arquivo existente.%n%nDesexa manter o arquivo existente? +FileExistsSelectAction=Seleccionar acción +FileExists2=O arquivo xa existe. +FileExistsOverwriteExisting=&Sobrescribir o arquivo existente +FileExistsKeepExisting=&Manter o arquivo existente +FileExistsOverwriteOrKeepAll=&Facer isto para os seguintes conflitos +ExistingFileNewerSelectAction=Seleccionar acción +ExistingFileNewer2=O arquivo existente é máis novo ca o que o asistente de instalación tenta instalar. +ExistingFileNewerOverwriteExisting=&Sobrescribir o arquivo existente +ExistingFileNewerKeepExisting=&Manter o arquivo existente (recomendado) +ExistingFileNewerOverwriteOrKeepAll=&Facer isto para os seguintes conflitos ErrorChangingAttr=Ocorreu un erro ao tentar mudar os atributos do arquivo existente: ErrorCreatingTemp=Ocorreu un erro ao tentar crear un arquivo no cartafol de destino: ErrorReadingSource=Ocorreu un erro ao tentar ler o arquivo orixe: diff --git a/installer/innosetup/Languages/Georgian.isl b/installer/innosetup/Languages/Georgian.isl new file mode 100644 index 000000000..785db127f --- /dev/null +++ b/installer/innosetup/Languages/Georgian.isl @@ -0,0 +1,384 @@ +; *** Inno Setup version 6.1.0+ Georgian *** +; Translated by Saba Khmaladze (skhmaladze@uglt.org) +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Georgian +LanguageID=$0437 +LanguageCodePage=0 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +DialogFontName=Sylfaen +;DialogFontSize=8 +WelcomeFontName=Sylfaen +;WelcomeFontSize=12 +TitleFontName=Sylfaen +;TitleFontSize=29 +CopyrightFontName=Sylfaen +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=ინსტალაცია +SetupWindowTitle=ინსტალდება - %1 +UninstallAppTitle=წაშლა +UninstallAppFullTitle=იშლება %1 + +; *** Misc. common +InformationTitle=ინფორმაცია +ConfirmTitle=დაზუსტება +ErrorTitle=შეცდომა + +; *** SetupLdr messages +SetupLdrStartupMessage=თქვენთან დაინსტალდება %1. გსურთ გაგრძელება? +LdrCannotCreateTemp=დროებითი ფაილი ვერ შეიქმნა. ინსტალაცია შეწყდა +LdrCannotExecTemp=დროებით საქაღალდეში ფაილი ვერ გაეშვა. ინსტალაცია შეწყდა +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nშეცდომა %2: %3 +SetupFileMissing=საინსტალაციო საქაღალდეში არ მოიძებნა ფაილი %1. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია. +SetupFileCorrupt=საინსტალაციო ფაილები დაზიანებულია. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია. +SetupFileCorruptOrWrongVer=საინსტალაციო ფაილები დაზიანებული ან არათავსებადია ამ ვერსიასთან. გაასწორეთ პრობლემა ან გადმოწერეთ პროგრამის ახალი ვერსია. +InvalidParameter=არასწორი პარამეტრი გადაეცა ბრძანებათა ველს:%n%n%1 +SetupAlreadyRunning=ინსტალაცია უკვე მიმდინარეობს. +WindowsVersionNotSupported=ეს პროგრამა Windows-ის ამ ვერსიაზე ვერ გაეშვება. +WindowsServicePackRequired=ამ პროგრამას სჭირდება %1 Service Pack %2 ან უფრო ახალი. +NotOnThisPlatform=ეს პროგრამა არ გაეშვება სისტემაზე %1. +OnlyOnThisPlatform=ეს პროგრამა უნდა გაეშვას სისტემაზე %1. +OnlyOnTheseArchitectures=ეს პროგრამა დაინსტალდება მხოლოდ Windows-ის შემდეგ არქიტექტურაზე:%n%n%1 +WinVersionTooLowError=ამ პროგრამას სჭირდება %1 ვერსია %2 ან უფრო ახალი. +WinVersionTooHighError=ეს პროგრამა ვერ დაინსტალდება %1 ვერსია %2-ზე ან უფრო ახალზე. +AdminPrivilegesRequired=ამ პროგრამის დასაინსტალებლად საჭიროა ადმინისტრატორის ანგარიში. +PowerUserPrivilegesRequired=ამ პროგრამის დასაინსტალებლად საჭიროა ადმინისტრატორის ან მძლავრი იუზერის (Power User) ანგარიში. +SetupAppRunningError=საინსტალაციომ დაადგინა რომ გაშვებულია %1.%n%nგთხოვთ დახურეთ გაშვებული პროცესები, გასაგრძელებლად დააჭირეთ ღილაკს კარგი ან გამოსასვლელად ღილაკს გაუქმება. +UninstallAppRunningError=ამომშლელმა დაადგინა რომ გაშვებულია %1.%n%nგთხოვთ დახურეთ გაშვებული პროცესები, გასაგრძელებლად დააჭირეთ ღილაკს კარგი ან გამოსასვლელად ღილაკს გაუქმება. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=აირჩიეთ ინსტალაციის რეჟიმი +PrivilegesRequiredOverrideInstruction=აირჩიეთ ინსტალაციის რეჟიმი +PrivilegesRequiredOverrideText1=%1 შეიძლება დაინსტალდეს ყველასთვის (საჭიროა ადმინისტრატორის უფლება) ან მხოლოდ თქვენთვის. +PrivilegesRequiredOverrideText2=%1 შეიძლება დაინსტალდეს მხოლოდ თქვენთვის ან ყველასთვის (საჭიროა ადმინისტრატორის უფლება). +PrivilegesRequiredOverrideAllUsers=დაინსტალება ყველა მომხმარებლისტვის +PrivilegesRequiredOverrideAllUsersRecommended=დაინსტალება ყველა მომხმარებლისთვის (რეკომენდებულია) +PrivilegesRequiredOverrideCurrentUser=დაინსტალება მხოლოდ ჩემთვის +PrivilegesRequiredOverrideCurrentUserRecommended=დაინსტალება მხოლოდ ჩემთვის (რეკომენდებულია) + +; *** Misc. errors +ErrorCreatingDir=საინსტალაციომ ვერ შექმნა საქაღალდე "%1" +ErrorTooManyFilesInDir=საქაღალდეში "%1" ვერ შეიქმნა ფაილი, რადგან ის შეიცავს ძალიან ბევრ ფაილს + +; *** Setup common messages +ExitSetupTitle=საინსტალაციოს გათიშვა +ExitSetupMessage=ინსტალაცია არ დასრულებულა, გათიშვის შემთხვევაში პროცესი გაუქმდება.%n%nინსტალაციის დასასრულებლად მოგიწევთ საინსტალაციოს თავიდან გაშვება.%n%nგსურთ გათიშვა? +AboutSetupMenuItem=&ინსტალაციის შეწყვეტა... +AboutSetupTitle=ინსტალაციის შეწყვეტა +AboutSetupMessage=%1 ვერსია %2%n%3%n%n%1 ვებ-გვერდი:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< &უკან +ButtonNext=&შემდეგი > +ButtonInstall=&ინსტალაცია +ButtonOK=კარგი +ButtonCancel=გაუქმება +ButtonYes=&კი +ButtonYesToAll=კი ყველასთვის +ButtonNo=&არა +ButtonNoToAll=არა ყველასთვის +ButtonFinish=&დასრულება +ButtonBrowse=&მითითება... +ButtonWizardBrowse=მ&ითითება... +ButtonNewFolder=&ახალი საქაღალდე + +; *** "Select Language" dialog messages +SelectLanguageTitle=ინსტალაციის ენის არჩევა +SelectLanguageLabel=მიუთითეთ ენა, რომელზეც გაეშვება საინსტალაციო. + +; *** Common wizard text +ClickNext=გასაგრძელებლად დააჭირეთ შემდეგს, გასაუქმებლად გაუქმებას. +BeveledLabel= +BrowseDialogTitle=საქაღალდის მითითება +BrowseDialogLabel=აირჩიეთ საქაღალდე და დააჭირეთ ღილაკს კარგი. +NewFolderName=ახალი საქაღალდე + +; *** "Welcome" wizard page +WelcomeLabel1=მოგესალმებით [name]-(ი)ს საინსტალაციოში +WelcomeLabel2=საინსტალაციო დააინსტალებს [name/ver] კომპიუტერში.%n%nგაგრძელებამდე რეკომენდებულია დახუროთ გახსნილი პროგრამები. + +; *** "Password" wizard page +WizardPassword=პაროლი +PasswordLabel1=საინსტალაციო დაცულია პაროლით. +PasswordLabel3=შეიყვანეთ პაროლი და დააჭირეთ გაგრძელებას. +PasswordEditLabel=&პაროლი: +IncorrectPassword=შეყვანილი პაროლი არასწორია. + +; *** "License Agreement" wizard page +WizardLicense=სალიცენზიო შეთანხმება +LicenseLabel=გაგრძელებამდე ყურადღებით გაეცანით ქვემოთ მოცემულ ინფორმაციას. +LicenseLabel3=ყურადღებით წაიკითხეთ სალიცენზიო შეთანხმება. გაგრძელებისთვის თქვენ უნდა დაეთანხმოთ მას. +LicenseAccepted=ვეთანხმები სალიცენზიო შეთანხმებას +LicenseNotAccepted=არ ვეთანხმები სალიცენზიო შეთანხმებას + +; *** "Information" wizard pages +WizardInfoBefore=ინფორმაცია +InfoBeforeLabel=გაგრძელებამდე გთხოვთ წაიკითხოთ მნიშვნელოვანი ინფორმაცია. +InfoBeforeClickLabel=როცა მზად იქნები დააჭირე შემდეგს. +WizardInfoAfter=ინფორმაცია +InfoAfterLabel=გაგრძელებამდე გთხოვთ წაიკითხოთ მნიშვნელოვანი ინფორმაცია. +InfoAfterClickLabel=როცა მზად იქნები დააჭირე შემდეგს. + +; *** "User Information" wizard page +WizardUserInfo=ინფორმაცია მომხმარებელზე +UserInfoDesc=შეიყვანეთ ინფორმაცია თქვენზე. +UserInfoName=&სახელი: +UserInfoOrg=&ორგანიზაცია: +UserInfoSerial=სერიული &ნომერი: +UserInfoNameRequired=უნდა შეიყვანოთ სახელი. + +; *** "Select Destination Location" wizard page +WizardSelectDir=მიუთითეთ საინსტალაციო საქაღალდე +SelectDirDesc=სად დაინსტალდეს [name]? +SelectDirLabel3=საინსტალაციო დააინსტალებს [name]-(ი)ს მოცემულ საქაღალდეში. +SelectDirBrowseLabel=გასაგრძელებლად დააჭირეთ გაგრძელებას ან თუ გსურთ სხვა საქაღალდის მითითება - მითითებას. +DiskSpaceGBLabel=საჭიროა მინიმუმ [gb] გბ სივრცე. +DiskSpaceMBLabel=საჭიროა მინიმუმ [mb] მბ სივრცე. +CannotInstallToNetworkDrive=ვერ დაინსტალდება ქსელურ მისამართზე. +CannotInstallToUNCPath=ვერ დაინსტალდება UNC მისამართზე. +InvalidPath=უნდა შეიყვანეთ სრული მისამართი, დისკის სახელის ჩათვლით; მაგალითად:%n%nC:\APP%n%nან UNC მისამართი ფორმატში:%n%n\\server\share +InvalidDrive=დისკი ან UNC მისამართი არ არსებობს ან მიუწვდომელია. მიუთითეთ სხვა. +DiskSpaceWarningTitle=არასაკმარისი სივრცე დისკზე +DiskSpaceWarning=დასაინსტალებლად საჭიროა მინიმუმ %1 კბ სივრცე, მაგრამ ხელმისაწვდომია მხოლოდ %2 კბ.%n%nგსურთ გაგრძელება? +DirNameTooLong=საქაღალდის დასახელება ძალიან გრძელია. +InvalidDirName=საქაღალდის დასახელება არასწორია. +BadDirName32=საქაღალდის სახელში არ უნდა იყოს სიმბოლოები:%n%n%1 +DirExistsTitle=საქაღალდე არსებობს +DirExists=საქაღალდე:%n%n%1%n%nუკვე არსებობს. გსურთ მაგ საქაღალდეში დაინსტალება? +DirDoesntExistTitle=საქაღალდე არ არსებობს +DirDoesntExist=საქაღალდე:%n%n%1%n%nარ არსებობს. გსურთ შექმნა? + +; *** "Select Components" wizard page +WizardSelectComponents=აირჩიეთ კომპონენტები +SelectComponentsDesc=რომელი კომპონენტები დაინსტალდეს? +SelectComponentsLabel2=აირჩიეთ რომელი კომპონენტის დაინსტალებაც გსურთ; არ მონიშნოთ ის კომპონენტი რომლის დაინსტალებაც არ გსურთ. როცა მზად იქნებით დააჭირეთ გაგრძელებას. +FullInstallation=სრული ინსტალაცია +CompactInstallation=კომპაქტური ინსტალაცია +CustomInstallation=არჩევითი ინსტალაცია +NoUninstallWarningTitle=კომპონენტები არსებობს +NoUninstallWarning=საინსტალაციომ დაადგინა რომ ზოგიერთი კომპონენტი უკვე დაინსტალებულია:%n%n%1%n%nმათი არ მონიშვნა არ ნიშნავს რომ ისინი წაიშლება.%n%nგსურთ გაგრძელებას? +ComponentSize1=%1 კბ +ComponentSize2=%1 მბ +ComponentsDiskSpaceGBLabel=საჭიროა მინიმუმ [gb] გბ სივრცე. +ComponentsDiskSpaceMBLabel=საჭიროა მინიმუმ [mb] მბ სივრცე. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=მიუთითეთ დამატებითი დავალებები +SelectTasksDesc=რა დამატებითი დავალება შესრულდეს? +SelectTasksLabel2=აირჩიეთ თუ რომელიმე დამატებითი ფუნქციის შესრულება გსურთ [name]-(ი)ს ინსტალაციისას და დააჭირეთ შემდეგს. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=აირჩიეთ გაშვების მენიუს საქაღალდე +SelectStartMenuFolderDesc=სად დაინსტალდეს პროგრამის ხატულები? +SelectStartMenuFolderLabel3=საინსტალაციო პროგრამის ხატულებს გაშვების მენიუსთვის დააინსტალებს ქვემოთ მოცემულ საქაღალდეში. +SelectStartMenuFolderBrowseLabel=გასაგრძელებლად დააჭირეთ შემდეგს ან მიუთითეთ სხვა საქაღალდე. +MustEnterGroupName=ჩაწერეთ საქაღალდის სახელი. +GroupNameTooLong=საქაღალდის სახელი ან მისამართი ძალიან გრძელია. +InvalidGroupName=საქაღალდის სახელი არასწორია. +BadGroupName=სახელში არ უნდა იყოს შემდეგი სიმბოლოები:%n%n%1 +NoProgramGroupCheck2=&არ შეიქმნას საქაღალდე გაშვების მენიუში + +; *** "Ready to Install" wizard page +WizardReady=მზადაა დასაინსტალებლად +ReadyLabel1=საინსტალაციო მზადაა დააინსტალოს [name] თქვენს კომპიუტერში. +ReadyLabel2a=დასაინსტალებლად დააჭირეთ ინსტალაციას ან დაბრუნდით უკან და გადახედეთ პარამეტრებს. +ReadyLabel2b=დასაინსტალებლად დააჭირეთ ინსტალაციას. +ReadyMemoUserInfo=ინფორმაცია მომხმარებელზე: +ReadyMemoDir=ინფორმაცია საქაღალდეზე: +ReadyMemoType=ინსტალაციის სახეობა: +ReadyMemoComponents=არჩეული კომპონენტები: +ReadyMemoGroup=გაშვების მენიუს საქაღალდე: +ReadyMemoTasks=დამატებითი დავალებები: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=იწერება დამატებითი ფაილები... +ButtonStopDownload=&გადმოწერის შეწყვეტა +StopDownload=ნამდვილად გსურთ გადმოწერის შეწყვეტა? +ErrorDownloadAborted=გადმოწერა შეწყდა +ErrorDownloadFailed=არ გადმოიწერა: %1 %2 +ErrorDownloadSizeFailed=ზომის მონაცემები ვერ მივიღეთ: %1 %2 +ErrorFileHash1=ფაილის ჰეში არ ემთხვევა: %1 +ErrorFileHash2=ფაილის ჰეში არასწორია: ველოდებოდით %1, მივიღეთ %2 +ErrorProgress=არასწორი პროცესი: %1 of %2 +ErrorFileSize=ფაილის არასწორი ზომა: ველოდებოდთ %1, მივიღეთ %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=მზადდება დასაინსტალებლად +PreparingDesc=საინსტალაციო ემზადება რომ [name] დააინსტალოს კომპიუტერში. +PreviousInstallNotCompleted=წინა პროგრამის ინსტალაცია/წაშლა არ მოხერხდა. საჭიროა კომპიუტერის გადატვირთვა.%n%nკომპიუტერის გადატვირთვის შემდეგ ხელახლა გაუშვით [name]-(ი)ს საინსტალაციო. +CannotContinue=ინსტალაცია არ გაგრძელდა. გასაუქმებლად დააჭირეთ გაუქმებას. +ApplicationsFound=მოცემული პროგრამები იყენებენ ფაილებს რომელიც საინსტალაციომ უნდა განახლოს. რეკომენდებულია უფლება მისცეთ საინსტალაციოს გათიშოს ეს პროგრამები. +ApplicationsFound2=ოცემული პროგრამები იყენებენ ფაილებს რომელიც საინსტალაციომ უნდა განახლოს. რეკომენდებულია უფლება მისცეთ საინსტალაციოს გათიშოს ეს პროგრამები. ინსტალაციის დასრულების შემდეგ საინსტალაციო შეეცდება ხელახლა ჩართოს ეს პროგრამები. +CloseApplications=&აპლიკაციების ავტომატურად გათიშვა +DontCloseApplications=&არ გაითიშოს აპლიკაციები +ErrorCloseApplications=საინსტალაციომ ავტომატურად ვერ გათიშა ყველა აპლიკაცია. რეკომენდებულია რომ გათიშოთ ყველა აპლიკაცია. +PrepareToInstallNeedsRestart=საინსტალაციომ უნდა გადატვირთოს კომპიუტერი. კომპიუტერის გადატვირთვის შემდეგ ხელახლა გაუშვით საინსტალაციო რათა გაგრძელდეს [name]-(ი)ს ინსტალაცია.%n%nგსურთ ახლა გადატვირთვა? + +; *** "Installing" wizard page +WizardInstalling=ინსტალდება +InstallingLabel=მოითმინეთ სანამ საინსტალაციო დააინსტალებს [name]-(ი)ს კომპიუტერში. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=სრულდება [name]-(ი)ს ინსტალაცია +FinishedLabelNoIcons=საინსტალაციომ დაასრულა [name]-(ი)ს ინსტალაცია კომპიუტერში. +FinishedLabel=საინსტალაციომ დაასრულა [name]-(ი)ს ინსტალაცია კომპიუტერში. პროგრამა გაეშვება შესაბამისი ხატულას მონიშვნის შემთხვევაში. +ClickFinish=საინსტალაციოს გასათიშად დააჭირეთ დასრულებას. +FinishedRestartLabel=[name]-(ი)ს ინსტალაციის დასრულებისთვის საჭიროა კომპიუტეირს გადატვირთვა. გსურთ ახლა გადატვირთვა? +FinishedRestartMessage=[name]-(ი)ს ინსტალაციის დასრულებისთვის საჭიროა კომპიუტეირს გადატვირთვა.%n%nგსურთ ახლა გადატვირთვა? +ShowReadmeCheck=README ფაილის ჩვენება +YesRadio=&კი, გადაიტვირთოს კომპიუტერი +NoRadio=&არა, მოგვიანებით გადავტვირთავ კომპიუტერს +; used for example as 'Run MyProg.exe' +RunEntryExec=გაეშვას %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=%1-(ი)ს ნახვა + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=ინსტალაციისთვის საჭიროა შემდეგი დისკი +SelectDiskLabel2=ჩადეთ დისკი %1 და დააჭირეთ ღილაკს კარგი.%n%nთუ ფაილები არაა ქვემოთ მოცემულ მისამართზე დააჭირეთ მითითებას და მიუთითეთ სწორი მისამართი. +PathLabel=&მისამართი: +FileNotInDir2=ფაილი "%1" არ მოიძებნა "%2" მისამართზე. ჩადეთ სწორი დისკი და ან აირჩიეთ სხვა საქაღალდე. +SelectDirectoryLabel=მიუთითეთ შემდეგი დისკის მდებარეობა. + +; *** Installation phase messages +SetupAborted=ინსტალაცია არ დასრულდა.%n%nგაასწორეთ პრობლემა და გაუშვით ინსტალაცია ხელახლა. +AbortRetryIgnoreSelectAction=აირჩიეთ მოქმედება +AbortRetryIgnoreRetry=&ხელახლა ცდა +AbortRetryIgnoreIgnore=&შეცდომის უგულებელყოფა და გაგრძელება +AbortRetryIgnoreCancel=ინსტალაციის გაუქმება + +; *** Installation status messages +StatusClosingApplications=ითიშება პროგრამები... +StatusCreateDirs=მიმდინარეობს საქაღალდეების შექმნა... +StatusExtractFiles=მიმდინარეობს ფაილების ამოარქივება... +StatusCreateIcons=მიმდინარეობს ხატულების შექმნა... +StatusCreateIniEntries=იქმნება INI ჩანაწერები... +StatusCreateRegistryEntries=იქმნება რეესტრის ჩანაწერები... +StatusRegisterFiles=მიმდინარეობს ფაილების რეგისტრაცია... +StatusSavingUninstall=ინახება წასაშლელი ინფორმაცია... +StatusRunProgram=სრულდება ინსტალაცია... +StatusRestartingApplications=იტვირთება პროგრამები... +StatusRollback=უქმდება ცვლილებები... + +; *** Misc. errors +ErrorInternal2=შიდა შეცდომა: %1 +ErrorFunctionFailedNoCode=%1 არ შესრულდა +ErrorFunctionFailed=%1 არ შესრულდა; კოდი %2 +ErrorFunctionFailedWithMessage=%1 არ შესრულდა; კოდი %2.%n%3 +ErrorExecutingProgram=არ შესრულდა file:%n%1 + +; *** Registry errors +ErrorRegOpenKey=შეცდომა რეესტრის გასაღების გახსნისას:%n%1\%2 +ErrorRegCreateKey=შეცდომა რეესტრის გასაღების შექმნისას:%n%1\%2 +ErrorRegWriteKey=შეცდომა რეესტრის გასაღების ჩაწერისას:%n%1\%2 + +; *** INI errors +ErrorIniEntry=შეცდომა INI ჩანაწერის შექმნისას ფაილში "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&ფაილის გამოტოვება (არაა რეკომენდებული) +FileAbortRetryIgnoreIgnoreNotRecommended=&შეცდომის უგულებელყოფა და გამოტოვება (არაა რეკომენდებული) +SourceIsCorrupted=საწყისი ფაილი დაზიანებულია +SourceDoesntExist=საწყისი ფაილი "%1" არსებობს +ExistingFileReadOnly2=არსებული ფაილი არ ჩანაცვლდა, იმიტომ რომ ის არის მხოლოდ წაკითხვადი. +ExistingFileReadOnlyRetry=&მხოლოდ წაკითხვადის მოხსნა და ხელახლა ცდა +ExistingFileReadOnlyKeepExisting=&არსებული ფაილის დატოვება +ErrorReadingExistingDest=შეცდომა არსებული ფაილის წაკითხვისას: +FileExistsSelectAction=აირჩიეთ მოქმედება +FileExists2=ფაილი უკვე არსებობს. +FileExistsOverwriteExisting=&არსებულ ფაილზე გადაწერა +FileExistsKeepExisting=ა&რსებული ფაილის დატოვება +FileExistsOverwriteOrKeepAll=&მოქმედების გამეორება შემდეგი კონფლიქტის დროს +ExistingFileNewerSelectAction=აირჩიეთ მოქმედება +ExistingFileNewer2=არსებული ფაილი უფრო ახალია ვიდრე საინსტალაციოში მოცემული. +ExistingFileNewerOverwriteExisting=&არსებულ ფაილზე გადაწერა +ExistingFileNewerKeepExisting=ა&რსებული ფაილის დატოვება (რეკომენდებულია) +ExistingFileNewerOverwriteOrKeepAll=&მოქმედების გამეორება შემდეგი კონფლიქტის დროს +ErrorChangingAttr=შეცდომა არსებულ ფაილზე ატრიბუტის შეცვლისას: +ErrorCreatingTemp=შეცდომა საქაღალდეში ფაილის შექმნისას: +ErrorReadingSource=შეცდომა საწყისი ფაილის წაკითხვისას: +ErrorCopying=შეცდომა ფაილის კოპირებისას: +ErrorReplacingExistingFile=შეცდომა არსებულ ფაილზ გადაწერისას: +ErrorRestartReplace=გადაწერა არ მოხერხდა: +ErrorRenamingTemp=შეცდომა ფაილის სახელის შეცვლისას: +ErrorRegisterServer=არ დარეგისტრდა DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 არ გაეშვა, კოდი: %1 +ErrorRegisterTypeLib=არ დარეგისტრდა ბიბლიოთეკა: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=ყველა მომხმარებელი +UninstallDisplayNameMarkCurrentUser=ახლანდელი მომხმარებელი + +; *** Post-installation errors +ErrorOpeningReadme=შეცდომა Readme ფაილის გახსნისას. +ErrorRestartingComputer=საინსტალაციომ ვერ გადატვირთა კომპიუტერი. გადატვირთეთ ხელით. + +; *** Uninstaller messages +UninstallNotFound=ფაილი "%1" არ არსებობს. არ წაიშალა. +UninstallOpenError=ფაილი "%1" არ არსებობს. არ წაიშალა +UninstallUnsupportedVer=წასაშლელი ჟურნალის ფაილი "%1" ისეთ ფორმატშია რომ ამ ვერსიის წამშლელი ვერ აღიქვამს. არ წაიშალა +UninstallUnknownEntry=უცნობი ჩანაწერი (%1) +ConfirmUninstall=ნამდვილად გსურთ სრულად წაშალოთ %1 და ყველა მისი კომპონენტი? +UninstallOnlyOnWin64=ეს ინსტალაცია შეიძლება წაიშალოს მხოლოდ 64 ბიტიან Windows-ში. +OnlyAdminCanUninstall=ეს ინსტალაცია შეიძლება წაიშალოს მხოლოდ ადმინისტრატორის უფლებებით. +UninstallStatusLabel=მოითმინეთ სანამ %1 წაიშლება კომპიუტერიდან. +UninstalledAll=%1 წაიშალა კომპიუტერიდან. +UninstalledMost=%1-(ი)ს წაშლა დასრულდა.%n%nზოგიერთი ელემენტი არ წაიშალა და წაშალეთ ხელით. +UninstalledAndNeedsRestart=იმისთვის რომ %1 წაიშალოს საჭიროა კომპიუტერის გადატვირთვა.%n%nგსურთ ახლა გადატვირთვა? +UninstallDataCorrupted="%1" ფაილი დაზიანებულია. არ წაიშალა + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=წაიშალოს გაზიარებული ფაილი? +ConfirmDeleteSharedFile2=სისტემამ აღმოაჩინა რომ მოცემულ გაზიარებულ ფაილს არ იყენებს არც ერთი პროგრამა. გსურთ წამშლელმა წაშალოს გაზიარებული ფაილი?%n%nთუ რომელიმე პროგრამა ისევ იყენებს ამ ფაილს და მას წაშლით, ეს პროგრამები ვეღარ იმუშავებენ ნორმალურად. დარწმუნებული თუ არ ხართ დააჭირეთ არას. ფაილის დატოვება არაფერს გააფუჭებს. +SharedFileNameLabel=ფაილის სახელი: +SharedFileLocationLabel=მდებარეობა: +WizardUninstalling=წაშლის სტატუსი +StatusUninstalling=იშლება %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=ინსტალდება %1. +ShutdownBlockReasonUninstallingApp=იშლება %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 ვერსია %2 +AdditionalIcons=დამატებითი ხატულები: +CreateDesktopIcon=ხატულას შექმნა სამუშაო მაგიდაზე +CreateQuickLaunchIcon=სწრაფი გაშვების ხატულას შექმნა +ProgramOnTheWeb=%1 ვებ-გვერდზე +UninstallProgram=წაიშალოს %1 +LaunchProgram=გაეშვას %1 +AssocFileExtension=&ასოცირდეს %1 %2 ფაილის გაფართოებასთან? +AssocingFileExtension=%1 ასოცირდება %2 ფაილების გაფართოებასთან... +AutoStartProgramGroupDescription=გაშვება: +AutoStartProgram=ავტომატურად გაშვება %1 +AddonHostProgramNotFound=%1 არ მოიძებნა მითითებულ საქაღალდეში.%n%nგსურთ გაგრძელება? \ No newline at end of file diff --git a/installer/innosetup/Languages/German.isl b/installer/innosetup/Languages/German.isl new file mode 100644 index 000000000..9877b2b9c --- /dev/null +++ b/installer/innosetup/Languages/German.isl @@ -0,0 +1,406 @@ +; ****************************************************** +; *** *** +; *** Inno Setup version 6.1.0+ German messages *** +; *** *** +; *** Changes 6.0.0+ Author: *** +; *** *** +; *** Jens Brand (jens.brand@wolf-software.de) *** +; *** *** +; *** Original Authors: *** +; *** *** +; *** Peter Stadler (Peter.Stadler@univie.ac.at) *** +; *** Michael Reitz (innosetup@assimilate.de) *** +; *** *** +; *** Contributors: *** +; *** *** +; *** Roland Ruder (info@rr4u.de) *** +; *** Hans Sperber (Hans.Sperber@de.bosch.com) *** +; *** LaughingMan (puma.d@web.de) *** +; *** *** +; ****************************************************** +; +; Diese Übersetzung hält sich an die neue deutsche Rechtschreibung. + +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ + +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Deutsch +LanguageID=$0407 +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Setup +SetupWindowTitle=Setup - %1 +UninstallAppTitle=Entfernen +UninstallAppFullTitle=%1 entfernen + +; *** Misc. common +InformationTitle=Information +ConfirmTitle=Bestätigen +ErrorTitle=Fehler + +; *** SetupLdr messages +SetupLdrStartupMessage=%1 wird jetzt installiert. Möchten Sie fortfahren? +LdrCannotCreateTemp=Es konnte keine temporäre Datei erstellt werden. Das Setup wurde abgebrochen +LdrCannotExecTemp=Die Datei konnte nicht im temporären Ordner ausgeführt werden. Das Setup wurde abgebrochen +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nFehler %2: %3 +SetupFileMissing=Die Datei %1 fehlt im Installationsordner. Bitte beheben Sie das Problem oder besorgen Sie sich eine neue Kopie des Programms. +SetupFileCorrupt=Die Setup-Dateien sind beschädigt. Besorgen Sie sich bitte eine neue Kopie des Programms. +SetupFileCorruptOrWrongVer=Die Setup-Dateien sind beschädigt oder inkompatibel zu dieser Version des Setups. Bitte beheben Sie das Problem oder besorgen Sie sich eine neue Kopie des Programms. +InvalidParameter=Ein ungültiger Parameter wurde auf der Kommandozeile übergeben:%n%n%1 +SetupAlreadyRunning=Setup läuft bereits. +WindowsVersionNotSupported=Dieses Programm unterstützt die auf Ihrem Computer installierte Windows-Version nicht. +WindowsServicePackRequired=Dieses Programm benötigt %1 Service Pack %2 oder höher. +NotOnThisPlatform=Dieses Programm kann nicht unter %1 ausgeführt werden. +OnlyOnThisPlatform=Dieses Programm muss unter %1 ausgeführt werden. +OnlyOnTheseArchitectures=Dieses Programm kann nur auf Windows-Versionen installiert werden, die folgende Prozessor-Architekturen unterstützen:%n%n%1 +WinVersionTooLowError=Dieses Programm benötigt %1 Version %2 oder höher. +WinVersionTooHighError=Dieses Programm kann nicht unter %1 Version %2 oder höher installiert werden. +AdminPrivilegesRequired=Sie müssen als Administrator angemeldet sein, um dieses Programm installieren zu können. +PowerUserPrivilegesRequired=Sie müssen als Administrator oder als Mitglied der Hauptbenutzer-Gruppe angemeldet sein, um dieses Programm installieren zu können. +SetupAppRunningError=Das Setup hat entdeckt, dass %1 zurzeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. +UninstallAppRunningError=Die Deinstallation hat entdeckt, dass %1 zurzeit ausgeführt wird.%n%nBitte schließen Sie jetzt alle laufenden Instanzen und klicken Sie auf "OK", um fortzufahren, oder auf "Abbrechen", um zu beenden. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Installationsmodus auswählen +PrivilegesRequiredOverrideInstruction=Bitte wählen Sie den Installationsmodus +PrivilegesRequiredOverrideText1=%1 kann für alle Benutzer (erfordert Administrationsrechte) oder nur für Sie installiert werden. +PrivilegesRequiredOverrideText2=%1 kann nur für Sie oder für alle Benutzer (erfordert Administrationsrechte) installiert werden. +PrivilegesRequiredOverrideAllUsers=Installation für &alle Benutzer +PrivilegesRequiredOverrideAllUsersRecommended=Installation für &alle Benutzer (empfohlen) +PrivilegesRequiredOverrideCurrentUser=Installation nur für &Sie +PrivilegesRequiredOverrideCurrentUserRecommended=Installation nur für &Sie (empfohlen) + +; *** Misc. errors +ErrorCreatingDir=Das Setup konnte den Ordner "%1" nicht erstellen. +ErrorTooManyFilesInDir=Das Setup konnte eine Datei im Ordner "%1" nicht erstellen, weil er zu viele Dateien enthält. + +; *** Setup common messages +ExitSetupTitle=Setup verlassen +ExitSetupMessage=Das Setup ist noch nicht abgeschlossen. Wenn Sie jetzt beenden, wird das Programm nicht installiert.%n%nSie können das Setup zu einem späteren Zeitpunkt nochmals ausführen, um die Installation zu vervollständigen.%n%nSetup verlassen? +AboutSetupMenuItem=&Über das Setup ... +AboutSetupTitle=Über das Setup +AboutSetupMessage=%1 Version %2%n%3%n%n%1 Webseite:%n%4 +AboutSetupNote= +TranslatorNote=German translation maintained by Jens Brand (jens.brand@wolf-software.de) + +; *** Buttons +ButtonBack=< &Zurück +ButtonNext=&Weiter > +ButtonInstall=&Installieren +ButtonOK=OK +ButtonCancel=Abbrechen +ButtonYes=&Ja +ButtonYesToAll=J&a für Alle +ButtonNo=&Nein +ButtonNoToAll=N&ein für Alle +ButtonFinish=&Fertigstellen +ButtonBrowse=&Durchsuchen ... +ButtonWizardBrowse=Du&rchsuchen ... +ButtonNewFolder=&Neuen Ordner erstellen + +; *** "Select Language" dialog messages +SelectLanguageTitle=Setup-Sprache auswählen +SelectLanguageLabel=Wählen Sie die Sprache aus, die während der Installation benutzt werden soll: + +; *** Common wizard text +ClickNext="Weiter" zum Fortfahren, "Abbrechen" zum Verlassen. +BeveledLabel= +BrowseDialogTitle=Ordner suchen +BrowseDialogLabel=Wählen Sie einen Ordner aus und klicken Sie danach auf "OK". +NewFolderName=Neuer Ordner + +; *** "Welcome" wizard page +WelcomeLabel1=Willkommen zum [name] Setup-Assistenten +WelcomeLabel2=Dieser Assistent wird jetzt [name/ver] auf Ihrem Computer installieren.%n%nSie sollten alle anderen Anwendungen beenden, bevor Sie mit dem Setup fortfahren. + +; *** "Password" wizard page +WizardPassword=Passwort +PasswordLabel1=Diese Installation wird durch ein Passwort geschützt. +PasswordLabel3=Bitte geben Sie das Passwort ein und klicken Sie danach auf "Weiter". Achten Sie auf korrekte Groß-/Kleinschreibung. +PasswordEditLabel=&Passwort: +IncorrectPassword=Das eingegebene Passwort ist nicht korrekt. Bitte versuchen Sie es noch einmal. + +; *** "License Agreement" wizard page +WizardLicense=Lizenzvereinbarung +LicenseLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren. +LicenseLabel3=Lesen Sie bitte die folgenden Lizenzvereinbarungen. Benutzen Sie bei Bedarf die Bildlaufleiste oder drücken Sie die "Bild Ab"-Taste. +LicenseAccepted=Ich &akzeptiere die Vereinbarung +LicenseNotAccepted=Ich &lehne die Vereinbarung ab + +; *** "Information" wizard pages +WizardInfoBefore=Information +InfoBeforeLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren. +InfoBeforeClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind, mit dem Setup fortzufahren. +WizardInfoAfter=Information +InfoAfterLabel=Lesen Sie bitte folgende wichtige Informationen, bevor Sie fortfahren. +InfoAfterClickLabel=Klicken Sie auf "Weiter", sobald Sie bereit sind, mit dem Setup fortzufahren. + +; *** "User Information" wizard page +WizardUserInfo=Benutzerinformationen +UserInfoDesc=Bitte tragen Sie Ihre Daten ein. +UserInfoName=&Name: +UserInfoOrg=&Organisation: +UserInfoSerial=&Seriennummer: +UserInfoNameRequired=Sie müssen einen Namen eintragen. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Ziel-Ordner wählen +SelectDirDesc=Wohin soll [name] installiert werden? +SelectDirLabel3=Das Setup wird [name] in den folgenden Ordner installieren. +SelectDirBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswählen möchten. +DiskSpaceGBLabel=Mindestens [gb] GB freier Speicherplatz ist erforderlich. +DiskSpaceMBLabel=Mindestens [mb] MB freier Speicherplatz ist erforderlich. +CannotInstallToNetworkDrive=Das Setup kann nicht in einen Netzwerk-Pfad installieren. +CannotInstallToUNCPath=Das Setup kann nicht in einen UNC-Pfad installieren. Wenn Sie auf ein Netzlaufwerk installieren möchten, müssen Sie dem Netzwerkpfad einen Laufwerksbuchstaben zuordnen. +InvalidPath=Sie müssen einen vollständigen Pfad mit einem Laufwerksbuchstaben angeben, z. B.:%n%nC:\Beispiel%n%noder einen UNC-Pfad in der Form:%n%n\\Server\Freigabe +InvalidDrive=Das angegebene Laufwerk bzw. der UNC-Pfad existiert nicht oder es kann nicht darauf zugegriffen werden. Wählen Sie bitte einen anderen Ordner. +DiskSpaceWarningTitle=Nicht genug freier Speicherplatz +DiskSpaceWarning=Das Setup benötigt mindestens %1 KB freien Speicherplatz zum Installieren, aber auf dem ausgewählten Laufwerk sind nur %2 KB verfügbar.%n%nMöchten Sie trotzdem fortfahren? +DirNameTooLong=Der Ordnername/Pfad ist zu lang. +InvalidDirName=Der Ordnername ist nicht gültig. +BadDirName32=Ordnernamen dürfen keine der folgenden Zeichen enthalten:%n%n%1 +DirExistsTitle=Ordner existiert bereits +DirExists=Der Ordner:%n%n%1%n%n existiert bereits. Möchten Sie trotzdem in diesen Ordner installieren? +DirDoesntExistTitle=Ordner ist nicht vorhanden +DirDoesntExist=Der Ordner:%n%n%1%n%nist nicht vorhanden. Soll der Ordner erstellt werden? + +; *** "Select Components" wizard page +WizardSelectComponents=Komponenten auswählen +SelectComponentsDesc=Welche Komponenten sollen installiert werden? +SelectComponentsLabel2=Wählen Sie die Komponenten aus, die Sie installieren möchten. Klicken Sie auf "Weiter", wenn Sie bereit sind, fortzufahren. +FullInstallation=Vollständige Installation +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakte Installation +CustomInstallation=Benutzerdefinierte Installation +NoUninstallWarningTitle=Komponenten vorhanden +NoUninstallWarning=Das Setup hat festgestellt, dass die folgenden Komponenten bereits auf Ihrem Computer installiert sind:%n%n%1%n%nDiese nicht mehr ausgewählten Komponenten werden nicht vom Computer entfernt.%n%nMöchten Sie trotzdem fortfahren? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Die aktuelle Auswahl erfordert mindestens [gb] GB Speicherplatz. +ComponentsDiskSpaceMBLabel=Die aktuelle Auswahl erfordert mindestens [mb] MB Speicherplatz. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Zusätzliche Aufgaben auswählen +SelectTasksDesc=Welche zusätzlichen Aufgaben sollen ausgeführt werden? +SelectTasksLabel2=Wählen Sie die zusätzlichen Aufgaben aus, die das Setup während der Installation von [name] ausführen soll, und klicken Sie danach auf "Weiter". + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Startmenü-Ordner auswählen +SelectStartMenuFolderDesc=Wo soll das Setup die Programm-Verknüpfungen erstellen? +SelectStartMenuFolderLabel3=Das Setup wird die Programm-Verknüpfungen im folgenden Startmenü-Ordner erstellen. +SelectStartMenuFolderBrowseLabel=Klicken Sie auf "Weiter", um fortzufahren. Klicken Sie auf "Durchsuchen", falls Sie einen anderen Ordner auswählen möchten. +MustEnterGroupName=Sie müssen einen Ordnernamen eingeben. +GroupNameTooLong=Der Ordnername/Pfad ist zu lang. +InvalidGroupName=Der Ordnername ist nicht gültig. +BadGroupName=Der Ordnername darf keine der folgenden Zeichen enthalten:%n%n%1 +NoProgramGroupCheck2=&Keinen Ordner im Startmenü erstellen + +; *** "Ready to Install" wizard page +WizardReady=Bereit zur Installation. +ReadyLabel1=Das Setup ist jetzt bereit, [name] auf Ihrem Computer zu installieren. +ReadyLabel2a=Klicken Sie auf "Installieren", um mit der Installation zu beginnen, oder auf "Zurück", um Ihre Einstellungen zu überprüfen oder zu ändern. +ReadyLabel2b=Klicken Sie auf "Installieren", um mit der Installation zu beginnen. +ReadyMemoUserInfo=Benutzerinformationen: +ReadyMemoDir=Ziel-Ordner: +ReadyMemoType=Setup-Typ: +ReadyMemoComponents=Ausgewählte Komponenten: +ReadyMemoGroup=Startmenü-Ordner: +ReadyMemoTasks=Zusätzliche Aufgaben: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Lade zusätzliche Dateien herunter... +ButtonStopDownload=Download &abbrechen +StopDownload=Sind Sie sicher, dass Sie den Download abbrechen wollen? +ErrorDownloadAborted=Download abgebrochen +ErrorDownloadFailed=Download fehlgeschlagen: %1 %2 +ErrorDownloadSizeFailed=Fehler beim Ermitteln der Größe: %1 %2 +ErrorFileHash1=Fehler beim Ermitteln der Datei-Prüfsumme: %1 +ErrorFileHash2=Ungültige Datei-Prüfsumme: erwartet %1, gefunden %2 +ErrorProgress=Ungültiger Fortschritt: %1 von %2 +ErrorFileSize=Ungültige Dateigröße: erwartet %1, gefunden %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Vorbereitung der Installation +PreparingDesc=Das Setup bereitet die Installation von [name] auf diesem Computer vor. +PreviousInstallNotCompleted=Eine vorherige Installation/Deinstallation eines Programms wurde nicht abgeschlossen. Der Computer muss neu gestartet werden, um die Installation/Deinstallation zu beenden.%n%nStarten Sie das Setup nach dem Neustart Ihres Computers erneut, um die Installation von [name] durchzuführen. +CannotContinue=Das Setup kann nicht fortfahren. Bitte klicken Sie auf "Abbrechen" zum Verlassen. +ApplicationsFound=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden müssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schließen. +ApplicationsFound2=Die folgenden Anwendungen benutzen Dateien, die aktualisiert werden müssen. Es wird empfohlen, Setup zu erlauben, diese Anwendungen zu schließen. Nachdem die Installation fertiggestellt wurde, versucht Setup, diese Anwendungen wieder zu starten. +CloseApplications=&Schließe die Anwendungen automatisch +DontCloseApplications=Schließe die A&nwendungen nicht +ErrorCloseApplications=Das Setup konnte nicht alle Anwendungen automatisch schließen. Es wird empfohlen, alle Anwendungen zu schließen, die Dateien benutzen, die vom Setup vor einer Fortsetzung aktualisiert werden müssen. +PrepareToInstallNeedsRestart=Das Setup muss Ihren Computer neu starten. Führen Sie nach dem Neustart Setup erneut aus, um die Installation von [name] abzuschließen.%n%nWollen Sie jetzt neu starten? + +; *** "Installing" wizard page +WizardInstalling=Installiere ... +InstallingLabel=Warten Sie bitte, während [name] auf Ihrem Computer installiert wird. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Beenden des [name] Setup-Assistenten +FinishedLabelNoIcons=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. +FinishedLabel=Das Setup hat die Installation von [name] auf Ihrem Computer abgeschlossen. Die Anwendung kann über die installierten Programm-Verknüpfungen gestartet werden. +ClickFinish=Klicken Sie auf "Fertigstellen", um das Setup zu beenden. +FinishedRestartLabel=Um die Installation von [name] abzuschließen, muss das Setup Ihren Computer neu starten. Möchten Sie jetzt neu starten? +FinishedRestartMessage=Um die Installation von [name] abzuschließen, muss das Setup Ihren Computer neu starten.%n%nMöchten Sie jetzt neu starten? +ShowReadmeCheck=Ja, ich möchte die LIESMICH-Datei sehen +YesRadio=&Ja, Computer jetzt neu starten +NoRadio=&Nein, ich werde den Computer später neu starten +; used for example as 'Run MyProg.exe' +RunEntryExec=%1 starten +; used for example as 'View Readme.txt' +RunEntryShellExec=%1 anzeigen + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Nächsten Datenträger einlegen +SelectDiskLabel2=Legen Sie bitte Datenträger %1 ein und klicken Sie auf "OK".%n%nWenn sich die Dateien von diesem Datenträger in einem anderen als dem angezeigten Ordner befinden, dann geben Sie bitte den korrekten Pfad ein oder klicken auf "Durchsuchen". +PathLabel=&Pfad: +FileNotInDir2=Die Datei "%1" befindet sich nicht in "%2". Bitte Ordner ändern oder richtigen Datenträger einlegen. +SelectDirectoryLabel=Geben Sie bitte an, wo der nächste Datenträger eingelegt wird. + +; *** Installation phase messages +SetupAborted=Das Setup konnte nicht abgeschlossen werden.%n%nBeheben Sie bitte das Problem und starten Sie das Setup erneut. +AbortRetryIgnoreSelectAction=Bitte auswählen +AbortRetryIgnoreRetry=&Nochmals versuchen +AbortRetryIgnoreIgnore=&Den Fehler ignorieren und fortfahren +AbortRetryIgnoreCancel=Installation abbrechen + +; *** Installation status messages +StatusClosingApplications=Anwendungen werden geschlossen ... +StatusCreateDirs=Ordner werden erstellt ... +StatusExtractFiles=Dateien werden entpackt ... +StatusCreateIcons=Verknüpfungen werden erstellt ... +StatusCreateIniEntries=INI-Einträge werden erstellt ... +StatusCreateRegistryEntries=Registry-Einträge werden erstellt ... +StatusRegisterFiles=Dateien werden registriert ... +StatusSavingUninstall=Deinstallationsinformationen werden gespeichert ... +StatusRunProgram=Installation wird beendet ... +StatusRestartingApplications=Neustart der Anwendungen ... +StatusRollback=Änderungen werden rückgängig gemacht ... + +; *** Misc. errors +ErrorInternal2=Interner Fehler: %1 +ErrorFunctionFailedNoCode=%1 schlug fehl +ErrorFunctionFailed=%1 schlug fehl; Code %2 +ErrorFunctionFailedWithMessage=%1 schlug fehl; Code %2.%n%3 +ErrorExecutingProgram=Datei kann nicht ausgeführt werden:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Registry-Schlüssel konnte nicht geöffnet werden:%n%1\%2 +ErrorRegCreateKey=Registry-Schlüssel konnte nicht erstellt werden:%n%1\%2 +ErrorRegWriteKey=Fehler beim Schreiben des Registry-Schlüssels:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Fehler beim Erstellen eines INI-Eintrages in der Datei "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=Diese Datei &überspringen (nicht empfohlen) +FileAbortRetryIgnoreIgnoreNotRecommended=Den Fehler &ignorieren und fortfahren (nicht empfohlen) +SourceIsCorrupted=Die Quelldatei ist beschädigt +SourceDoesntExist=Die Quelldatei "%1" existiert nicht +ExistingFileReadOnly2=Die vorhandene Datei kann nicht ersetzt werden, da sie schreibgeschützt ist. +ExistingFileReadOnlyRetry=&Den Schreibschutz entfernen und noch einmal versuchen +ExistingFileReadOnlyKeepExisting=Die &vorhandene Datei behalten +ErrorReadingExistingDest=Lesefehler in Datei: +FileExistsSelectAction=Aktion auswählen +FileExists2=Die Datei ist bereits vorhanden. +FileExistsOverwriteExisting=Vorhandene Datei &überschreiben +FileExistsKeepExisting=Vorhandene Datei &behalten +FileExistsOverwriteOrKeepAll=&Dies auch für die nächsten Konflikte ausführen +ExistingFileNewerSelectAction=Aktion auswählen +ExistingFileNewer2=Die vorhandene Datei ist neuer als die Datei, die installiert werden soll. +ExistingFileNewerOverwriteExisting=Vorhandene Datei &überschreiben +ExistingFileNewerKeepExisting=Vorhandene Datei &behalten (empfohlen) +ExistingFileNewerOverwriteOrKeepAll=&Dies auch für die nächsten Konflikte ausführen +ErrorChangingAttr=Fehler beim Ändern der Datei-Attribute: +ErrorCreatingTemp=Fehler beim Erstellen einer Datei im Ziel-Ordner: +ErrorReadingSource=Fehler beim Lesen der Quelldatei: +ErrorCopying=Fehler beim Kopieren einer Datei: +ErrorReplacingExistingFile=Fehler beim Ersetzen einer vorhandenen Datei: +ErrorRestartReplace="Ersetzen nach Neustart" fehlgeschlagen: +ErrorRenamingTemp=Fehler beim Umbenennen einer Datei im Ziel-Ordner: +ErrorRegisterServer=DLL/OCX konnte nicht registriert werden: %1 +ErrorRegSvr32Failed=RegSvr32-Aufruf scheiterte mit Exit-Code %1 +ErrorRegisterTypeLib=Typen-Bibliothek konnte nicht registriert werden: %1 + +; *** Uninstall display name markings +; used for example as 'Mein Programm (32 Bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'Mein Programm (32 Bit, Alle Benutzer)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 Bit +UninstallDisplayNameMark64Bit=64 Bit +UninstallDisplayNameMarkAllUsers=Alle Benutzer +UninstallDisplayNameMarkCurrentUser=Aktueller Benutzer + +; *** Post-installation errors +ErrorOpeningReadme=Fehler beim Öffnen der LIESMICH-Datei. +ErrorRestartingComputer=Das Setup konnte den Computer nicht neu starten. Bitte führen Sie den Neustart manuell durch. + +; *** Uninstaller messages +UninstallNotFound=Die Datei "%1" existiert nicht. Entfernen der Anwendung fehlgeschlagen. +UninstallOpenError=Die Datei "%1" konnte nicht geöffnet werden. Entfernen der Anwendung fehlgeschlagen. +UninstallUnsupportedVer=Das Format der Deinstallationsdatei "%1" konnte nicht erkannt werden. Entfernen der Anwendung fehlgeschlagen. +UninstallUnknownEntry=In der Deinstallationsdatei wurde ein unbekannter Eintrag (%1) gefunden. +ConfirmUninstall=Sind Sie sicher, dass Sie %1 und alle zugehörigen Komponenten entfernen möchten? +UninstallOnlyOnWin64=Diese Installation kann nur unter 64-Bit-Windows-Versionen entfernt werden. +OnlyAdminCanUninstall=Diese Installation kann nur von einem Benutzer mit Administrator-Rechten entfernt werden. +UninstallStatusLabel=Warten Sie bitte, während %1 von Ihrem Computer entfernt wird. +UninstalledAll=%1 wurde erfolgreich von Ihrem Computer entfernt. +UninstalledMost=Entfernen von %1 beendet.%n%nEinige Komponenten konnten nicht entfernt werden. Diese können von Ihnen manuell gelöscht werden. +UninstalledAndNeedsRestart=Um die Deinstallation von %1 abzuschließen, muss Ihr Computer neu gestartet werden.%n%nMöchten Sie jetzt neu starten? +UninstallDataCorrupted="%1"-Datei ist beschädigt. Entfernen der Anwendung fehlgeschlagen. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Gemeinsame Datei entfernen? +ConfirmDeleteSharedFile2=Das System zeigt an, dass die folgende gemeinsame Datei von keinem anderen Programm mehr benutzt wird. Möchten Sie diese Datei entfernen lassen?%nSollte es doch noch Programme geben, die diese Datei benutzen und sie wird entfernt, funktionieren diese Programme vielleicht nicht mehr richtig. Wenn Sie unsicher sind, wählen Sie "Nein", um die Datei im System zu belassen. Es schadet Ihrem System nicht, wenn Sie die Datei behalten. +SharedFileNameLabel=Dateiname: +SharedFileLocationLabel=Ordner: +WizardUninstalling=Entfernen (Status) +StatusUninstalling=Entferne %1 ... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installation von %1. +ShutdownBlockReasonUninstallingApp=Deinstallation von %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 Version %2 +AdditionalIcons=Zusätzliche Symbole: +CreateDesktopIcon=&Desktop-Symbol erstellen +CreateQuickLaunchIcon=Symbol in der Schnellstartleiste erstellen +ProgramOnTheWeb=%1 im Internet +UninstallProgram=%1 entfernen +LaunchProgram=%1 starten +AssocFileExtension=&Registriere %1 mit der %2-Dateierweiterung +AssocingFileExtension=%1 wird mit der %2-Dateierweiterung registriert... +AutoStartProgramGroupDescription=Beginn des Setups: +AutoStartProgram=Starte automatisch%1 +AddonHostProgramNotFound=%1 konnte im ausgewählten Ordner nicht gefunden werden.%n%nMöchten Sie dennoch fortfahren? + diff --git a/installer/innosetup/Languages/Greek.isl b/installer/innosetup/Languages/Greek.isl index eef0cc8dd..8e603194f 100644 --- a/installer/innosetup/Languages/Greek.isl +++ b/installer/innosetup/Languages/Greek.isl @@ -1,7 +1,7 @@ -; *** Inno Setup version 6.0.0+ Greek messages *** +; *** Inno Setup version 6.1.0+ Greek messages *** ; ; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ +; https://jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno @@ -10,7 +10,7 @@ ; ; Originally translated by Anastasis Chatzioglou, baldycom@hotmail.com ; Updated by XhmikosR [XhmikosR, my_nickname at yahoo dot com] -; Updated to version 6.0.0+ by V. Karamichail, v.karamichail@outlook.com +; Updated to version 6.1.0+ by Vasileios Karamichail, v.karamichail@outlook.com ; [LangOptions] @@ -156,6 +156,7 @@ WizardSelectDir=Επιλογή Φακέλου Εγκατάστασης SelectDirDesc=Πού θέλετε να εγκατασταθεί το [name]; SelectDirLabel3=Ο Οδηγός Εγκατάστασης θα εγκαταστήσει το [name] στον ακόλουθο φάκελο. SelectDirBrowseLabel=Για να συνεχίσετε, πατήστε Επόμενο. Εάν θέλετε να επιλέξετε διαφορετικό φάκελο, πατήστε Αναζήτηση. +DiskSpaceGBLabel=Απαιτούνται τουλάχιστον [gb] GB ελεύθερου χώρου στο δίσκο. DiskSpaceMBLabel=Απαιτούνται τουλάχιστον [mb] MB ελεύθερου χώρου στο δίσκο. CannotInstallToNetworkDrive=Η εγκατάσταση δεν μπορεί να γίνει σε δίσκο δικτύου. CannotInstallToUNCPath=Η εγκατάσταση δεν μπορεί να γίνει σε διαδρομή UNC. @@ -183,6 +184,7 @@ NoUninstallWarningTitle=Οι Λειτουργικές Μονάδες Υπάρχ NoUninstallWarning=Ο Οδηγός Εγκατάστασης εντόπισε ότι τα ακόλουθα στοιχεία είναι ήδη εγκατεστημένα στον υπολογιστή σας:%n%n%1%n%nΑποεπιλέγοντας αυτά τα στοιχεία δεν θα απεγκατασταθούν.%n%nΘέλετε να συνεχίσετε παρόλα αυτά; ComponentSize1=%1 KB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Η τρέχουσα επιλογή απαιτεί τουλάχιστον [gb] GB χώρου στο δίσκο. ComponentsDiskSpaceMBLabel=Η τρέχουσα επιλογή απαιτεί τουλάχιστον [mb] MB χώρου στο δίσκο. ; *** "Select Additional Tasks" wizard page @@ -213,6 +215,18 @@ ReadyMemoComponents=Επιλεγμένες λειτουργικές μονάδε ReadyMemoGroup=Φάκελος στο μενού Έναρξη: ReadyMemoTasks=Επιπλέον ενέργειες: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Λήψη πρόσθετων αρχείων... +ButtonStopDownload=&Διακοπή λήψης +StopDownload=Είστε βέβαιοι ότι θέλετε να διακόψετε τη λήψη; +ErrorDownloadAborted=Η λήψη ακυρώθηκε +ErrorDownloadFailed=Η λήψη απέτυχε: %1 %2 +ErrorDownloadSizeFailed=Η λήψη του μεγέθους απέτυχε: %1 %2 +ErrorFileHash1=Αποτυχία υπολογισμού hash: %1 +ErrorFileHash2=Μη έγκυρο hash: αναμενόμενο %1, βρέθηκε %2 +ErrorProgress=Μη έγκυρη πρόοδος: %1 από %2 +ErrorFileSize=Μη έγκυρο μέγεθος αρχείου: αναμενόμενο %1, βρέθηκε %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Προετοιμασία Εγκατάστασης PreparingDesc=Ο Οδηγός Εγκατάστασης προετοιμάζεται για την εγκατάσταση του [name] στον υπολογιστή σας. @@ -222,7 +236,8 @@ ApplicationsFound=Οι ακόλουθες εφαρμογές χρησιμοπο ApplicationsFound2=Οι ακόλουθες εφαρμογές χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης. Συνιστάται να επιτρέψετε στον Οδηγό Εγκατάστασης να κλείσει αυτόματα αυτές τις εφαρμογές. Μετά την ολοκλήρωση της εγκατάστασης, ο Οδηγός Εγκατάστασης θα επιχειρήσει να κάνει επανεκκίνηση των εφαρμογών. CloseApplications=&Αυτόματο κλείσιμο των εφαρμογών DontCloseApplications=&Χωρίς κλείσιμο των εφαρμογών -ErrorCloseApplications=Η εγκατάσταση δεν μπόρεσε να κλείσει αυτόματα όλες τις εφαρμογές. Συνιστάται να κλείσετε όλες τις εφαρμογές που χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης προτού συνεχίσετε. +ErrorCloseApplications=Ο Οδηγός Εγκατάστασης δεν μπόρεσε να κλείσει αυτόματα όλες τις εφαρμογές. Συνιστάται να κλείσετε όλες τις εφαρμογές που χρησιμοποιούν αρχεία που πρέπει να ενημερωθούν από τον Οδηγό Εγκατάστασης προτού συνεχίσετε. +PrepareToInstallNeedsRestart=Ο Οδηγός Εγκατάστασης πρέπει να κάνει επανεκκίνηση του υπολογιστή σας. Μετά την επανεκκίνηση του υπολογιστή σας, εκτελέστε ξανά τον Οδηγό Εγκατάστασης για να ολοκληρώσετε την εγκατάσταση του [name].%n%nΘα θέλατε να κάνετε επανεκκίνηση τώρα; ; *** "Installing" wizard page WizardInstalling=Εγκατάσταση @@ -294,8 +309,16 @@ ExistingFileReadOnly2=Το υπάρχον αρχείο δεν μπόρεσε ν ExistingFileReadOnlyRetry=&Καταργήστε το χαρακτηριστικό μόνο για ανάγνωση και δοκιμάστε ξανά ExistingFileReadOnlyKeepExisting=&Διατηρήστε το υπάρχον αρχείο ErrorReadingExistingDest=Παρουσιάστηκε σφάλμα κατά την προσπάθεια ανάγνωσης του υπάρχοντος αρχείου: -FileExists=Το αρχείο υπάρχει ήδη.%n%nΘα θέλατε ο Οδηγός Εγκατάστασης να το αντικαταστήσει; -ExistingFileNewer=Το υπάρχον αρχείο είναι νεότερο από αυτό που ο Οδηγός Εγκατάστασης που προσπαθεί να εγκαταστήσει. Συνιστάται να διατηρείτε το υπάρχον αρχείο.%n%nΘέλετε να διατηρήσετε το υπάρχον αρχείο; +FileExistsSelectAction=Επιλέξτε ενέργεια +FileExists2=Το αρχείο υπάρχει ήδη. +FileExistsOverwriteExisting=&Αντικατάσταση υπάρχοντος αρχείου +FileExistsKeepExisting=&Διατήρηση υπάρχοντος αρχείου +FileExistsOverwriteOrKeepAll=&Να γίνει το ίδιο για τις επόμενες διενέξεις +ExistingFileNewerSelectAction=Επιλέξτε ενέργεια +ExistingFileNewer2=Το υπάρχον αρχείο είναι νεότερο από αυτό που προσπαθεί να εγκαταστήσει ο Οδηγός Εγκατάστασης. +ExistingFileNewerOverwriteExisting=&Αντικατάσταση υπάρχοντος αρχείου +ExistingFileNewerKeepExisting=&Διατήρηση υπάρχοντος αρχείου (συνιστάται) +ExistingFileNewerOverwriteOrKeepAll=&Να γίνει το ίδιο για τις επόμενες διενέξεις ErrorChangingAttr=Παρουσιάστηκε σφάλμα κατά την προσπάθεια αλλαγής των χαρακτηριστικών του υπάρχοντος αρχείου: ErrorCreatingTemp=Παρουσιάστηκε σφάλμα κατά την προσπάθεια δημιουργίας ενός αρχείου στον φακέλο προορισμού: ErrorReadingSource=Παρουσιάστηκε σφάλμα κατά την προσπάθεια ανάγνωσης του αρχείου προέλευσης: @@ -364,3 +387,4 @@ AssocingFileExtension=Γίνεται συσχέτιση του %1 με την ε AutoStartProgramGroupDescription=Εκκίνηση: AutoStartProgram=Αυτόματη εκκίνηση του %1 AddonHostProgramNotFound=Το %1 δε βρέθηκε στο φάκελο που επιλέξατε.%n%nΘέλετε να συνεχίσετε παρόλα αυτά; + diff --git a/installer/innosetup/Languages/Hebrew.isl b/installer/innosetup/Languages/Hebrew.isl new file mode 100644 index 000000000..98d9b498f --- /dev/null +++ b/installer/innosetup/Languages/Hebrew.isl @@ -0,0 +1,377 @@ +; *** Inno Setup version 6.1.0+ Hebrew messages (s_h(at)enativ.com) *** +; +; https://jrsoftware.org/files/istrans/ +; Translated by s_h (s_h@enativ.com) (c) 2020 +; + + +[LangOptions] +LanguageName=<05E2><05D1><05E8><05D9><05EA> +LanguageID=$040D +LanguageCodePage=1255 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Tahoma +;WelcomeFontSize=11 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 +RightToLeft=yes + +[Messages] + +; *** Application titles +SetupAppTitle= +SetupWindowTitle= - %1 +UninstallAppTitle= +UninstallAppFullTitle= %1 + +; *** Misc. common +InformationTitle= +ConfirmTitle= +ErrorTitle= + +; *** SetupLdr messages +SetupLdrStartupMessage= %1 . ? +LdrCannotCreateTemp= . +LdrCannotExecTemp= . + +; *** Startup error messages +LastErrorMessage=%1.%n%n %2: %3 +SetupFileMissing= %1 . . +SetupFileCorrupt= . . +SetupFileCorruptOrWrongVer= , . . +InvalidParameter= :%n%n%1 +SetupAlreadyRunning= . +WindowsVersionNotSupported= . +WindowsServicePackRequired= %1 %2 . +NotOnThisPlatform= %1. +OnlyOnThisPlatform= %1. +OnlyOnTheseArchitectures= '' :%n%n%1 +WinVersionTooLowError= %1 %2. +WinVersionTooHighError= %1 %2 +AdminPrivilegesRequired= . +PowerUserPrivilegesRequired= , ' ' . +SetupAppRunningError= %1 .%n%n , '' , '' . +UninstallAppRunningError= %1 .%n%n , '' , '' . + +; *** Startup questions +PrivilegesRequiredOverrideTitle= +PrivilegesRequiredOverrideInstruction= +PrivilegesRequiredOverrideText1=%1 ( ), . +PrivilegesRequiredOverrideText2=%1 , ( ). +PrivilegesRequiredOverrideAllUsers= & +PrivilegesRequiredOverrideAllUsersRecommended= & () +PrivilegesRequiredOverrideCurrentUser= & +PrivilegesRequiredOverrideCurrentUserRecommended= & () + +; *** Misc. errors +ErrorCreatingDir= "%1" +ErrorTooManyFilesInDir= "%1" + +; *** Setup common messages +ExitSetupTitle= +ExitSetupMessage= . , .%n%n .%n%n ? +AboutSetupMenuItem=& ... +AboutSetupTitle= +AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< & +ButtonNext=& > +ButtonInstall=& +ButtonOK= +ButtonCancel= +ButtonYes=& +ButtonYesToAll= & +ButtonNo=& +ButtonNoToAll=& +ButtonFinish=& +ButtonBrowse=&... +ButtonWizardBrowse=... +ButtonNewFolder=& + +; *** "Select Language" dialog messages +SelectLanguageTitle= +SelectLanguageLabel= . + +; *** Common wizard text +ClickNext= '' , '' . +BeveledLabel= +BrowseDialogTitle= +BrowseDialogLabel= '' +NewFolderName= + +; *** "Welcome" wizard page +WelcomeLabel1= [name] +WelcomeLabel2= [name/ver] .%n%n . + +; *** "Password" wizard page +WizardPassword= +PasswordLabel1= . +PasswordLabel3= , '' . , . +PasswordEditLabel=&: +IncorrectPassword= . . + +; *** "License Agreement" wizard page +WizardLicense= +LicenseLabel= . +LicenseLabel3= . . +LicenseAccepted= & +LicenseNotAccepted= & + +; *** "Information" wizard pages +WizardInfoBefore= +InfoBeforeLabel= . +InfoBeforeClickLabel= , ''. +WizardInfoAfter= +InfoAfterLabel= +InfoAfterClickLabel= , ''. + +; *** "User Information" wizard page +WizardUserInfo= +UserInfoDesc= . +UserInfoName=& : +UserInfoOrg=&: +UserInfoSerial=& : +UserInfoNameRequired= . + +; *** "Select Destination Location" wizard page +WizardSelectDir= +SelectDirDesc= [name]? +SelectDirLabel3= [name] . +SelectDirBrowseLabel=, ''. , ''. +DiskSpaceGBLabel= [gb] GB . +DiskSpaceMBLabel= [mb] MB . +CannotInstallToNetworkDrive= . +CannotInstallToUNCPath= UNC. +InvalidPath= ; :%n%nC:\APP%n%n UNC :%n%n\\server\share +InvalidDrive= -UNC . . +DiskSpaceWarningTitle= +DiskSpaceWarning= %1KB , %2KB . ? +DirNameTooLong= +InvalidDirName= . +BadDirName32= :%n%n%1 +DirExistsTitle= +DirExists=:%n%n%1%n%n . ? +DirDoesntExistTitle= +DirDoesntExist=:%n%n%1%n%n . ? + +; *** "Select Components" wizard page +WizardSelectComponents= +SelectComponentsDesc= ? +SelectComponentsLabel2= ; . '' . +FullInstallation= +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation= +CustomInstallation= +NoUninstallWarningTitle= +NoUninstallWarning= :%n%n%1%n .%n%n ? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel= [gb] GB . +ComponentsDiskSpaceMBLabel= [mb] MB . + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks= +SelectTasksDesc= ? +SelectTasksLabel2= [name], ''. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup= '' +SelectStartMenuFolderDesc= ? +SelectStartMenuFolderLabel3= ''. +SelectStartMenuFolderBrowseLabel=, ''. , ''. +MustEnterGroupName= . +GroupNameTooLong= +InvalidGroupName= -. +BadGroupName= :%n%n%1 +NoProgramGroupCheck2=& '' + +; *** "Ready to Install" wizard page +WizardReady= +ReadyLabel1= [name] . +ReadyLabel2a= '' , '' . +ReadyLabel2b= '' +ReadyMemoUserInfo= : +ReadyMemoDir= : +ReadyMemoType= : +ReadyMemoComponents= : +ReadyMemoGroup= '': +ReadyMemoTasks= : + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel= ... +ButtonStopDownload=& +StopDownload= ? +ErrorDownloadAborted= +ErrorDownloadFailed= : %1 %2 +ErrorDownloadSizeFailed= : %1 %2 +ErrorFileHash1= : %2 +ErrorFileHash2= : %2, %2 +ErrorProgress= : %1 %1 +ErrorFileSize= : %1, %1 + +; *** "Preparing to Install" wizard page +WizardPreparing= +PreparingDesc= [name] . +PreviousInstallNotCompleted=/ . .%n%n , [name]. +CannotContinue= . '' . +ApplicationsFound= . . +ApplicationsFound2= . . , . +CloseApplications=& +DontCloseApplications=& +ErrorCloseApplications= . . +PrepareToInstallNeedsRestart= . , [name].%n%n ? + +; *** "Installing" wizard page +WizardInstalling= +InstallingLabel= [name] . + +; *** "Setup Completed" wizard page +FinishedHeadingLabel= [name] +FinishedLabelNoIcons= [name] . +FinishedLabel= [name] . . +ClickFinish= '' . +FinishedRestartLabel= [name], . ? +FinishedRestartMessage= [name], .%n%n ? +ShowReadmeCheck=, -' ' +YesRadio=&, +NoRadio=&, +; used for example as 'Run MyProg.exe' +RunEntryExec= %1 +; used for example as 'View Readme.txt' +RunEntryShellExec= %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle= +SelectDiskLabel2= ' %1 ''.%n%n , ''. +PathLabel=&: +FileNotInDir2= "%1" "%2". . +SelectDirectoryLabel= . + +; *** Installation phase messages +SetupAborted= .%n%n . +AbortRetryIgnoreSelectAction= +AbortRetryIgnoreRetry=& +AbortRetryIgnoreIgnore=& +AbortRetryIgnoreCancel= + +; *** Installation status messages +StatusClosingApplications= ... +StatusCreateDirs= ... +StatusExtractFiles= ... +StatusCreateIcons= ... +StatusCreateIniEntries= INI... +StatusCreateRegistryEntries= ... +StatusRegisterFiles= ... +StatusSavingUninstall= ... +StatusRunProgram= ... +StatusRestartingApplications= ... +StatusRollback= ... + +; *** Misc. errors +ErrorInternal2= : %1 +ErrorFunctionFailedNoCode=%1 +ErrorFunctionFailed=%1 ; %2 +ErrorFunctionFailedWithMessage=%1 ; %2.%n%3 +ErrorExecutingProgram= :%n%1 + +; *** Registry errors +ErrorRegOpenKey= :%n%1\%2 +ErrorRegCreateKey= :%n%1\%2 +ErrorRegWriteKey= :%n%1\%2 + +; *** INI errors +ErrorIniEntry= INI "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=& ( ) +FileAbortRetryIgnoreIgnoreNotRecommended=& ( ) +SourceIsCorrupted= +SourceDoesntExist= "%1" +ExistingFileReadOnly2= . +ExistingFileReadOnlyRetry=& +ExistingFileReadOnlyKeepExisting=& +ErrorReadingExistingDest= : +FileExistsSelectAction= +FileExists2= . +FileExistsOverwriteExisting=& +FileExistsKeepExisting=& +FileExistsOverwriteOrKeepAll=& +ExistingFileNewerSelectAction= +ExistingFileNewer2= +ExistingFileNewerOverwriteExisting=& +ExistingFileNewerKeepExisting=& () +ExistingFileNewerOverwriteOrKeepAll=& +ErrorChangingAttr= : +ErrorCreatingTemp= : +ErrorReadingSource= : +ErrorCopying= : +ErrorReplacingExistingFile= : +ErrorRestartReplace= -RestartReplace: +ErrorRenamingTemp= : +ErrorRegisterServer= DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 %1 +ErrorRegisterTypeLib= : %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers= +UninstallDisplayNameMarkCurrentUser= + +; *** Post-installation errors +ErrorOpeningReadme= ' '. +ErrorRestartingComputer= . . + +; *** Uninstaller messages +UninstallNotFound= "%1" . . +UninstallOpenError= "%1". . +UninstallUnsupportedVer= "%1" " . +UninstallUnknownEntry= (%1) . +ConfirmUninstall= %1 ? +UninstallOnlyOnWin64= '' 64-. +OnlyAdminCanUninstall= . +UninstallStatusLabel= %1 . +UninstalledAll=%1 . +UninstalledMost= %1 .%n%n " , . +UninstalledAndNeedsRestart= %1, .%n%n ? +UninstallDataCorrupted= "%1" . + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle= ? +ConfirmDeleteSharedFile2= . ?%n%n , . , ''. . +SharedFileNameLabel= : +SharedFileLocationLabel=: +WizardUninstalling= +StatusUninstalling= %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp= %1. +ShutdownBlockReasonUninstallingApp= %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 %2 +AdditionalIcons= : +CreateDesktopIcon= & +CreateQuickLaunchIcon= +ProgramOnTheWeb=%1 +UninstallProgram= %1 +LaunchProgram= %1 +AssocFileExtension=& %1 %2 +AssocingFileExtension= %1 %2 +AutoStartProgramGroupDescription= : +AutoStartProgram= %1 +AddonHostProgramNotFound=%1 .%n%n ? \ No newline at end of file diff --git a/installer/innosetup/Languages/Hungarian.isl b/installer/innosetup/Languages/Hungarian.isl index 7fdee0b99..e66ed76cd 100644 --- a/installer/innosetup/Languages/Hungarian.isl +++ b/installer/innosetup/Languages/Hungarian.isl @@ -1,6 +1,6 @@ -;Inno Setup version 6.0.3+ Hungarian messages -;Based on the translation of Kornl Pl, kornelpal@gmail.com -;Istvn Szab, E-mail: istvanszabo890629@gmail.com +; *** Inno Setup version 6.1.0+ Hungarian messages *** +; Based on the translation of Kornél Pál, kornelpal@gmail.com +; István Szabó, E-mail: istvanszabo890629@gmail.com ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ @@ -30,282 +30,302 @@ LanguageCodePage=1250 [Messages] ; *** Application titles -SetupAppTitle=Telept -SetupWindowTitle=%1 - Telept -UninstallAppTitle=Eltvolt -UninstallAppFullTitle=%1 Eltvolt +SetupAppTitle=Telepítő +SetupWindowTitle=%1 - Telepítő +UninstallAppTitle=Eltávolító +UninstallAppFullTitle=%1 Eltávolító ; *** Misc. common -InformationTitle=Informcik -ConfirmTitle=Megerst +InformationTitle=Információk +ConfirmTitle=Megerősít ErrorTitle=Hiba ; *** SetupLdr messages -SetupLdrStartupMessage=%1 teleptve lesz. Szeretn folytatni? -LdrCannotCreateTemp=tmeneti fjl ltrehozsa nem lehetsges. A telepts megszaktva -LdrCannotExecTemp=Fjl futattsa nem lehetsges az tmeneti knyvtrban. A telepts megszaktva +SetupLdrStartupMessage=%1 telepítve lesz. Szeretné folytatni? +LdrCannotCreateTemp=Átmeneti fájl létrehozása nem lehetséges. A telepítés megszakítva +LdrCannotExecTemp=Fájl futattása nem lehetséges az átmeneti könyvtárban. A telepítés megszakítva HelpTextNote= ; *** Startup error messages LastErrorMessage=%1.%n%nHiba %2: %3 -SetupFileMissing=A(z) %1 fjl hinyzik a telept knyvtrbl. Krem hrtsa el a problmt, vagy szerezzen be egy msik pldnyt a programbl! -SetupFileCorrupt=A teleptsi fjlok srltek. Krem, szerezzen be j msolatot a programbl! -SetupFileCorruptOrWrongVer=A teleptsi fjlok srltek, vagy inkompatibilisek a telept ezen verzijval. Hrtsa el a problmt, vagy szerezzen be egy msik pldnyt a programbl! -InvalidParameter=A parancssorba tadott paramter rvnytelen:%n%n%1 -SetupAlreadyRunning=A Telept mr fut. -WindowsVersionNotSupported=A program nem tmogatja a Windows ezen verzijt. -WindowsServicePackRequired=A program futtatshoz %1 Service Pack %2 vagy jabb szksges. -NotOnThisPlatform=Ez a program nem futtathat %1 alatt. +SetupFileMissing=A(z) %1 fájl hiányzik a telepítő könyvtárából. Kérem hárítsa el a problémát, vagy szerezzen be egy másik példányt a programból! +SetupFileCorrupt=A telepítési fájlok sérültek. Kérem, szerezzen be új másolatot a programból! +SetupFileCorruptOrWrongVer=A telepítési fájlok sérültek, vagy inkompatibilisek a telepítő ezen verziójával. Hárítsa el a problémát, vagy szerezzen be egy másik példányt a programból! +InvalidParameter=A parancssorba átadott paraméter érvénytelen:%n%n%1 +SetupAlreadyRunning=A Telepítő már fut. +WindowsVersionNotSupported=A program nem támogatja a Windows ezen verzióját. +WindowsServicePackRequired=A program futtatásához %1 Service Pack %2 vagy újabb szükséges. +NotOnThisPlatform=Ez a program nem futtatható %1 alatt. OnlyOnThisPlatform=Ezt a programot %1 alatt kell futtatni. -OnlyOnTheseArchitectures=A program kizrlag a kvetkez processzor architektrkhoz tervezett Windows-on telepthet:%n%n%1 -WinVersionTooLowError=A program futtatshoz %1 %2 verzija vagy ksbbi szksges. -WinVersionTooHighError=Ez a program nem telepthet %1 %2 vagy ksbbire. -AdminPrivilegesRequired=Csak rendszergazdai mdban telepthet ez a program. -PowerUserPrivilegesRequired=Csak rendszergazdaknt vagy kiemelt felhasznlknt telepthet ez a program. -SetupAppRunningError=A telept gy szlelte %1 jelenleg fut.%n%nZrja be az sszes pldnyt, majd kattintson az 'OK'-ra a folytatshoz, vagy a 'Mgse'-re a kilpshez. -UninstallAppRunningError=Az eltvolt gy szlelte %1 jelenleg fut.%n%nZrja be az sszes pldnyt, majd kattintson az 'OK'-ra a folytatshoz, vagy a 'Mgse'-re a kilpshez. +OnlyOnTheseArchitectures=A program kizárólag a következő processzor architektúrákhoz tervezett Windows-on telepíthető:%n%n%1 +WinVersionTooLowError=A program futtatásához %1 %2 verziója vagy későbbi szükséges. +WinVersionTooHighError=Ez a program nem telepíthető %1 %2 vagy későbbire. +AdminPrivilegesRequired=Csak rendszergazdai módban telepíthető ez a program. +PowerUserPrivilegesRequired=Csak rendszergazdaként vagy kiemelt felhasználóként telepíthető ez a program. +SetupAppRunningError=A telepítő úgy észlelte %1 jelenleg fut.%n%nZárja be az összes példányt, majd kattintson az 'OK'-ra a folytatáshoz, vagy a 'Mégse'-re a kilépéshez. +UninstallAppRunningError=Az eltávolító úgy észlelte %1 jelenleg fut.%n%nZárja be az összes példányt, majd kattintson az 'OK'-ra a folytatáshoz, vagy a 'Mégse'-re a kilépéshez. ; *** Startup questions -PrivilegesRequiredOverrideTitle=Teleptsi md kivlasztsa -PrivilegesRequiredOverrideInstruction=Vlasszon teleptsi mdot -PrivilegesRequiredOverrideText1=%1 telepthet az sszes felhasznlnak (rendszergazdai jogok szksgesek), vagy csak magnak. -PrivilegesRequiredOverrideText2=%1 csak magnak telepthet, vagy az sszes felhasznlnak (rendszergazdai jogok szksgesek). -PrivilegesRequiredOverrideAllUsers=Telepts &mindenkinek -PrivilegesRequiredOverrideAllUsersRecommended=Telepts &mindenkinek (ajnlott) -PrivilegesRequiredOverrideCurrentUser=Telepts csak &nekem -PrivilegesRequiredOverrideCurrentUserRecommended=Telepts csak &nekem (ajnlott) +PrivilegesRequiredOverrideTitle=Telepítési mód kiválasztása +PrivilegesRequiredOverrideInstruction=Válasszon telepítési módot +PrivilegesRequiredOverrideText1=%1 telepíthető az összes felhasználónak (rendszergazdai jogok szükségesek), vagy csak magának. +PrivilegesRequiredOverrideText2=%1 csak magának telepíthető, vagy az összes felhasználónak (rendszergazdai jogok szükségesek). +PrivilegesRequiredOverrideAllUsers=Telepítés &mindenkinek +PrivilegesRequiredOverrideAllUsersRecommended=Telepítés &mindenkinek (ajánlott) +PrivilegesRequiredOverrideCurrentUser=Telepítés csak &nekem +PrivilegesRequiredOverrideCurrentUserRecommended=Telepítés csak &nekem (ajánlott) ; *** Misc. errors -ErrorCreatingDir=A Telept nem tudta ltrehozni a(z) "%1" knyvtrat -ErrorTooManyFilesInDir=Nem hozhat ltre fjl a(z) "%1" knyvtrban, mert az mr tl sok fjlt tartalmaz +ErrorCreatingDir=A Telepítő nem tudta létrehozni a(z) "%1" könyvtárat +ErrorTooManyFilesInDir=Nem hozható létre fájl a(z) "%1" könyvtárban, mert az már túl sok fájlt tartalmaz ; *** Setup common messages -ExitSetupTitle=Kilps a teleptbl -ExitSetupMessage=A telepts mg folyamatban van. Ha most kilp, a program nem kerl teleptsre.%n%nMsik alkalommal is futtathat a telepts befejezshez%n%nKilp a teleptbl? -AboutSetupMenuItem=&Nvjegy... -AboutSetupTitle=Telept nvjegye -AboutSetupMessage=%1 %2 verzi%n%3%n%nAz %1 honlapja:%n%4 +ExitSetupTitle=Kilépés a telepítőből +ExitSetupMessage=A telepítés még folyamatban van. Ha most kilép, a program nem kerül telepítésre.%n%nMásik alkalommal is futtatható a telepítés befejezéséhez%n%nKilép a telepítőből? +AboutSetupMenuItem=&Névjegy... +AboutSetupTitle=Telepítő névjegye +AboutSetupMessage=%1 %2 verzió%n%3%n%nAz %1 honlapja:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Vissza -ButtonNext=&Tovbb > -ButtonInstall=&Telept +ButtonNext=&Tovább > +ButtonInstall=&Telepít ButtonOK=OK -ButtonCancel=Mgse +ButtonCancel=Mégse ButtonYes=&Igen ButtonYesToAll=&Mindet ButtonNo=&Nem ButtonNoToAll=&Egyiket se -ButtonFinish=&Befejezs -ButtonBrowse=&Tallzs... -ButtonWizardBrowse=T&allzs... -ButtonNewFolder=j &knyvtr +ButtonFinish=&Befejezés +ButtonBrowse=&Tallózás... +ButtonWizardBrowse=T&allózás... +ButtonNewFolder=Új &könyvtár ; *** "Select Language" dialog messages -SelectLanguageTitle=Telept nyelvi bellts -SelectLanguageLabel=Vlassza ki a telepts alatt hasznlt nyelvet. +SelectLanguageTitle=Telepítő nyelvi beállítás +SelectLanguageLabel=Válassza ki a telepítés alatt használt nyelvet. ; *** Common wizard text -ClickNext=A folytatshoz kattintson a 'Tovbb'-ra, a kilpshez a 'Mgse'-re. +ClickNext=A folytatáshoz kattintson a 'Tovább'-ra, a kilépéshez a 'Mégse'-re. BeveledLabel= -BrowseDialogTitle=Vlasszon knyvtrt -BrowseDialogLabel=Vlasszon egy knyvtrat az albbi listbl, majd kattintson az 'OK'-ra. -NewFolderName=j knyvtr +BrowseDialogTitle=Válasszon könyvtárt +BrowseDialogLabel=Válasszon egy könyvtárat az alábbi listából, majd kattintson az 'OK'-ra. +NewFolderName=Új könyvtár ; *** "Welcome" wizard page -WelcomeLabel1=dvzli a(z) [name] Teleptvarzslja. -WelcomeLabel2=A(z) [name/ver] teleptsre kerl a szmtgpn.%n%nAjnlott minden, egyb fut alkalmazs bezrsa a folytats eltt. +WelcomeLabel1=Üdvözli a(z) [name] Telepítővarázslója. +WelcomeLabel2=A(z) [name/ver] telepítésre kerül a számítógépén.%n%nAjánlott minden, egyéb futó alkalmazás bezárása a folytatás előtt. ; *** "Password" wizard page -WizardPassword=Jelsz -PasswordLabel1=Ez a telepts jelszval vdett. -PasswordLabel3=Krem adja meg a jelszt, majd kattintson a 'Tovbb'-ra. A jelszavak kis- s nagy bet rzkenyek lehetnek. -PasswordEditLabel=&Jelsz: -IncorrectPassword=Az n ltal megadott jelsz helytelen. Prblja jra. +WizardPassword=Jelszó +PasswordLabel1=Ez a telepítés jelszóval védett. +PasswordLabel3=Kérem adja meg a jelszót, majd kattintson a 'Tovább'-ra. A jelszavak kis- és nagy betű érzékenyek lehetnek. +PasswordEditLabel=&Jelszó: +IncorrectPassword=Az ön által megadott jelszó helytelen. Próbálja újra. ; *** "License Agreement" wizard page -WizardLicense=Licencszerzds -LicenseLabel=Olvassa el figyelmesen az informcikat folytats eltt. -LicenseLabel3=Krem, olvassa el az albbi licencszerzdst. A telepts folytatshoz, el kell fogadnia a szerzdst. -LicenseAccepted=&Elfogadom a szerzdst -LicenseNotAccepted=&Nem fogadom el a szerzdst +WizardLicense=Licencszerződés +LicenseLabel=Olvassa el figyelmesen az információkat folytatás előtt. +LicenseLabel3=Kérem, olvassa el az alábbi licencszerződést. A telepítés folytatásához, el kell fogadnia a szerződést. +LicenseAccepted=&Elfogadom a szerződést +LicenseNotAccepted=&Nem fogadom el a szerződést ; *** "Information" wizard pages -WizardInfoBefore=Informcik -InfoBeforeLabel=Olvassa el a kvetkez fontos informcikat a folytats eltt. -InfoBeforeClickLabel=Ha kszen ll, kattintson a 'Tovbb'-ra. -WizardInfoAfter=Informcik -InfoAfterLabel=Olvassa el a kvetkez fontos informcikat a folytats eltt. -InfoAfterClickLabel=Ha kszen ll, kattintson a 'Tovbb'-ra. +WizardInfoBefore=Információk +InfoBeforeLabel=Olvassa el a következő fontos információkat a folytatás előtt. +InfoBeforeClickLabel=Ha készen áll, kattintson a 'Tovább'-ra. +WizardInfoAfter=Információk +InfoAfterLabel=Olvassa el a következő fontos információkat a folytatás előtt. +InfoAfterClickLabel=Ha készen áll, kattintson a 'Tovább'-ra. ; *** "User Information" wizard page -WizardUserInfo=Felhasznl adatai -UserInfoDesc=Krem, adja meg az adatait -UserInfoName=&Felhasznlnv: +WizardUserInfo=Felhasználó adatai +UserInfoDesc=Kérem, adja meg az adatait! +UserInfoName=&Felhasználónév: UserInfoOrg=&Szervezet: -UserInfoSerial=&Sorozatszm: -UserInfoNameRequired=Meg kell adnia egy nevet. +UserInfoSerial=&Sorozatszám: +UserInfoNameRequired=Meg kell adnia egy nevet! ; *** "Select Destination Location" wizard page -WizardSelectDir=Vlasszon clknyvtrat -SelectDirDesc=Hova telepljn a(z) [name]? -SelectDirLabel3=A(z) [name] az albbi knyvtrba lesz teleptve. -SelectDirBrowseLabel=A folytatshoz, kattintson a 'Tovbb'-ra. Ha msik knyvtrat vlasztana, kattintson a 'Tallzs'-ra. -DiskSpaceGBLabel=At least [gb] GB szabad terletre van szksg. -DiskSpaceMBLabel=Legalbb [mb] MB szabad terletre van szksg. -CannotInstallToNetworkDrive=A Telept nem tud hlzati meghajtra telepteni. -CannotInstallToUNCPath=A Telept nem tud hlzati UNC elrsi tra telepteni. -InvalidPath=Teljes tvonalat adjon meg, a meghajt betjelvel; pldul:%n%nC:\Alkalmazs%n%nvagy egy hlzati tvonalat a kvetkez alakban:%n%n\\kiszolgl\megoszts -InvalidDrive=A kivlasztott meghajt vagy hlzati megoszts nem ltezik vagy nem elrhet. Vlasszon egy msikat. -DiskSpaceWarningTitle=Nincs elg szabad terlet -DiskSpaceWarning=A Teleptnek legalbb %1 KB szabad lemezterletre van szksge, viszont a kivlasztott meghajtn csupn %2 KB ll rendelkezsre.%n%nMindenkppen folytatja? -DirNameTooLong=A knyvtr neve vagy az tvonal tl hossz. -InvalidDirName=A knyvtr neve rvnytelen. -BadDirName32=A knyvtrak nevei ezen karakterek egyikt sem tartalmazhatjk:%n%n%1 -DirExistsTitle=A knyvtr mr ltezik -DirExists=A knyvtr:%n%n%1%n%nmr ltezik. Mindenkpp ide akar telepteni? -DirDoesntExistTitle=A knyvtr nem ltezik -DirDoesntExist=A knyvtr:%n%n%1%n%nnem ltezik. Szeretn ltrehozni? +WizardSelectDir=Válasszon célkönyvtárat +SelectDirDesc=Hova települjön a(z) [name]? +SelectDirLabel3=A(z) [name] az alábbi könyvtárba lesz telepítve. +SelectDirBrowseLabel=A folytatáshoz, kattintson a 'Tovább'-ra. Ha másik könyvtárat választana, kattintson a 'Tallózás'-ra. +DiskSpaceGBLabel=Legalább [gb] GB szabad területre van szükség. +DiskSpaceMBLabel=Legalább [mb] MB szabad területre van szükség. +CannotInstallToNetworkDrive=A Telepítő nem tud hálózati meghajtóra telepíteni. +CannotInstallToUNCPath=A Telepítő nem tud hálózati UNC elérési útra telepíteni. +InvalidPath=Teljes útvonalat adjon meg, a meghajtó betűjelével; például:%n%nC:\Alkalmazás%n%nvagy egy hálózati útvonalat a következő alakban:%n%n\\kiszolgáló\megosztás +InvalidDrive=A kiválasztott meghajtó vagy hálózati megosztás nem létezik vagy nem elérhető. Válasszon egy másikat. +DiskSpaceWarningTitle=Nincs elég szabad terület +DiskSpaceWarning=A Telepítőnek legalább %1 KB szabad lemezterületre van szüksége, viszont a kiválasztott meghajtón csupán %2 KB áll rendelkezésre.%n%nMindenképpen folytatja? +DirNameTooLong=A könyvtár neve vagy az útvonal túl hosszú. +InvalidDirName=A könyvtár neve érvénytelen. +BadDirName32=A könyvtárak nevei ezen karakterek egyikét sem tartalmazhatják:%n%n%1 +DirExistsTitle=A könyvtár már létezik +DirExists=A könyvtár:%n%n%1%n%nmár létezik. Mindenképp ide akar telepíteni? +DirDoesntExistTitle=A könyvtár nem létezik +DirDoesntExist=A könyvtár:%n%n%1%n%nnem létezik. Szeretné létrehozni? ; *** "Select Components" wizard page -WizardSelectComponents=sszetevk kivlasztsa -SelectComponentsDesc=Mely sszetevk kerljenek teleptsre? -SelectComponentsLabel2=Jellje ki a teleptend sszetevket; trlje a telepteni nem kvnt sszetevket. Kattintson a 'Tovbb'-ra, ha kszen ll a folytatsra. -FullInstallation=Teljes telepts +WizardSelectComponents=Összetevők kiválasztása +SelectComponentsDesc=Mely összetevők kerüljenek telepítésre? +SelectComponentsLabel2=Jelölje ki a telepítendő összetevőket; törölje a telepíteni nem kívánt összetevőket. Kattintson a 'Tovább'-ra, ha készen áll a folytatásra. +FullInstallation=Teljes telepítés ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) -CompactInstallation=Szoksos telepts -CustomInstallation=Egyni telepts -NoUninstallWarningTitle=Ltez sszetev -NoUninstallWarning=A telept gy tallta, hogy a kvetkez sszetevk mr teleptve vannak a szmtgpre:%n%n%1%n%nEzen sszetevk kijellsnek trlse, nem tvoltja el azokat a szmtgprl.%n%nMindenkppen folytatja? +CompactInstallation=Szokásos telepítés +CustomInstallation=Egyéni telepítés +NoUninstallWarningTitle=Létező összetevő +NoUninstallWarning=A telepítő úgy találta, hogy a következő összetevők már telepítve vannak a számítógépre:%n%n%1%n%nEzen összetevők kijelölésének törlése, nem távolítja el azokat a számítógépről.%n%nMindenképpen folytatja? ComponentSize1=%1 KB ComponentSize2=%1 MB -ComponentsDiskSpaceMBLabel=A jelenlegi kijells legalbb [gb] GB lemezterletet ignyel. -ComponentsDiskSpaceMBLabel=A jelenlegi kijells legalbb [mb] MB lemezterletet ignyel. +ComponentsDiskSpaceGBLabel=A jelenlegi kijelölés legalább [gb] GB lemezterületet igényel. +ComponentsDiskSpaceMBLabel=A jelenlegi kijelölés legalább [mb] MB lemezterületet igényel. ; *** "Select Additional Tasks" wizard page -WizardSelectTasks=Tovbbi feladatok -SelectTasksDesc=Mely kiegszt feladatok kerljenek vgrehajtsra? -SelectTasksLabel2=Jellje ki, mely kiegszt feladatokat hajtsa vgre a Telept a(z) [name] teleptse sorn, majd kattintson a 'Tovbb'-ra. +WizardSelectTasks=További feladatok +SelectTasksDesc=Mely kiegészítő feladatok kerüljenek végrehajtásra? +SelectTasksLabel2=Jelölje ki, mely kiegészítő feladatokat hajtsa végre a Telepítő a(z) [name] telepítése során, majd kattintson a 'Tovább'-ra. ; *** "Select Start Menu Folder" wizard page -WizardSelectProgramGroup=Start Men knyvtra -SelectStartMenuFolderDesc=Hova helyezze a Telept a program parancsikonjait? -SelectStartMenuFolderLabel3=A Telept a program parancsikonjait a Start men kvetkez mappjban fogja ltrehozni. -SelectStartMenuFolderBrowseLabel=A folytatshoz kattintson a 'Tovbb'-ra. Ha msik mappt vlasztana, kattintson a 'Tallzs'-ra. +WizardSelectProgramGroup=Start Menü könyvtára +SelectStartMenuFolderDesc=Hova helyezze a Telepítő a program parancsikonjait? +SelectStartMenuFolderLabel3=A Telepítő a program parancsikonjait a Start menü következő mappájában fogja létrehozni. +SelectStartMenuFolderBrowseLabel=A folytatáshoz kattintson a 'Tovább'-ra. Ha másik mappát választana, kattintson a 'Tallózás'-ra. MustEnterGroupName=Meg kell adnia egy mappanevet. -GroupNameTooLong=A knyvtr neve vagy az tvonal tl hossz. -InvalidGroupName=A knyvtr neve rvnytelen. -BadGroupName=A knyvtrak nevei ezen karakterek egyikt sem tartalmazhatjk:%n%n%1 -NoProgramGroupCheck2=&Ne hozzon ltre mappt a Start menben +GroupNameTooLong=A könyvtár neve vagy az útvonal túl hosszú. +InvalidGroupName=A könyvtár neve érvénytelen. +BadGroupName=A könyvtárak nevei ezen karakterek egyikét sem tartalmazhatják:%n%n%1 +NoProgramGroupCheck2=&Ne hozzon létre mappát a Start menüben ; *** "Ready to Install" wizard page -WizardReady=Kszen llunk a teleptsre -ReadyLabel1=A Telept kszen ll, a(z) [name] szmtgpre teleptshez. -ReadyLabel2a=Kattintson a 'Telepts'-re a folytatshoz, vagy a "Vissza"-ra a belltsok ttekintshez vagy megvltoztatshoz. -ReadyLabel2b=Kattintson a 'Telepts'-re a folytatshoz. -ReadyMemoUserInfo=Felhasznl adatai: -ReadyMemoDir=Telepts clknyvtra: -ReadyMemoType=Telepts tpusa: -ReadyMemoComponents=Vlasztott sszetevk: -ReadyMemoGroup=Start men mappja: -ReadyMemoTasks=Kiegszt feladatok: +WizardReady=Készen állunk a telepítésre +ReadyLabel1=A Telepítő készen áll, a(z) [name] számítógépre telepítéshez. +ReadyLabel2a=Kattintson a 'Telepítés'-re a folytatáshoz, vagy a "Vissza"-ra a beállítások áttekintéséhez vagy megváltoztatásához. +ReadyLabel2b=Kattintson a 'Telepítés'-re a folytatáshoz. +ReadyMemoUserInfo=Felhasználó adatai: +ReadyMemoDir=Telepítés célkönyvtára: +ReadyMemoType=Telepítés típusa: +ReadyMemoComponents=Választott összetevők: +ReadyMemoGroup=Start menü mappája: +ReadyMemoTasks=Kiegészítő feladatok: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=További fájlok letöltése... +ButtonStopDownload=&Letöltés megállítása +StopDownload=Biztos, hogy leakarja állítani a letöltést? +ErrorDownloadAborted=Letöltés megszakítva +ErrorDownloadFailed=A letöltés meghiúsult: %1 %2 +ErrorDownloadSizeFailed=Hiba a fájlméret lekérése során: %1 %2 +ErrorFileHash1=Fájl Hash (hasítóérték) hiba: %1 +ErrorFileHash2=Érvénytelen hash fájl, várt érték: %1, számított: %2 +ErrorProgress=Érvénytelen folyamat: %1 : %2 +ErrorFileSize=Érvénytelen fájlméret, várt méret %1, számított: %2 ; *** "Preparing to Install" wizard page -WizardPreparing=Felkszls a teleptsre -PreparingDesc=A Telept felkszl a(z) [name] szmtgpre trtn teleptshez. -PreviousInstallNotCompleted=gy korbbi program teleptse/eltvoltsa nem fejezdtt be. jra kell indtania a szmtgpt a msik telepts befejezshez.%n%nA szmtgpe jraindtsa utn ismt futtassa a Teleptt a(z) [name] teleptsnek befejezshez. -CannotContinue=A telepts nem folytathat. A kilpshez kattintson a 'Mgse'-re -ApplicationsFound=A kvetkez alkalmazsok olyan fjlokat hasznlnak, amelyeket a Teleptnek frissteni kell. Ajnlott, hogy engedlyezze a Teleptnek ezen alkalmazsok automatikus bezrst. -ApplicationsFound2=A kvetkez alkalmazsok olyan fjlokat hasznlnak, amelyeket a Teleptnek frissteni kell. Ajnlott, hogy engedlyezze a Teleptnek ezen alkalmazsok automatikus bezrst. A telepts befejezse utn a Telept megksrli az alkalmazsok jraindtst. -CloseApplications=&Alkalmazsok automatikus bezrsa -DontCloseApplications=&Ne zrja be az alkalmazsokat -ErrorCloseApplications=A Telept nem tudott minden alkalmazst automatikusan bezrni. A folytats eltt ajnlott minden, a Telept ltal frisstend fjlokat hasznl alkalmazst bezrni. -PrepareToInstallNeedsRestart=A teleptnek jra kell indtania a szmtgpet. jaindtst kveten, futassa jbl a teleptt, a [name] teleptsnek befejezshez .%n%njra szeretn indtani most a szmtgpet? +WizardPreparing=Felkészülés a telepítésre +PreparingDesc=A Telepítő felkészül a(z) [name] számítógépre történő telepítéshez. +PreviousInstallNotCompleted=gy korábbi program telepítése/eltávolítása nem fejeződött be. Újra kell indítania a számítógépét a másik telepítés befejezéséhez.%n%nA számítógépe újraindítása után ismét futtassa a Telepítőt a(z) [name] telepítésének befejezéséhez. +CannotContinue=A telepítés nem folytatható. A kilépéshez kattintson a 'Mégse'-re. +ApplicationsFound=A következő alkalmazások olyan fájlokat használnak, amelyeket a Telepítőnek frissíteni kell. Ajánlott, hogy engedélyezze a Telepítőnek ezen alkalmazások automatikus bezárását. +ApplicationsFound2=A következő alkalmazások olyan fájlokat használnak, amelyeket a Telepítőnek frissíteni kell. Ajánlott, hogy engedélyezze a Telepítőnek ezen alkalmazások automatikus bezárását. A telepítés befejezése után, a Telepítő megkísérli az alkalmazások újraindítását. +CloseApplications=&Alkalmazások automatikus bezárása +DontCloseApplications=&Ne zárja be az alkalmazásokat +ErrorCloseApplications=A Telepítő nem tudott minden alkalmazást automatikusan bezárni. A folytatás előtt ajánlott minden, a Telepítő által frissítendő fájlokat használó alkalmazást bezárni. +PrepareToInstallNeedsRestart=A telepítőnek most újra kell indítania a számítógépet. Az újraindítás után, futtassa újból ezt a telepítőt, hogy befejezze a [name] telepítését.%n%nÚjra szeretné most indítani a gépet? ; *** "Installing" wizard page -WizardInstalling=Telepts -InstallingLabel=Krem vrjon, amg a(z) [name] teleptse zajlik. +WizardInstalling=Telepítés +InstallingLabel=Kérem várjon, amíg a(z) [name] telepítése zajlik. ; *** "Setup Completed" wizard page -FinishedHeadingLabel=A(z) [name] teleptsnek befejezse -FinishedLabelNoIcons=A Telept vgzett a(z) [name] teleptsvel. -FinishedLabel=A Telept vgzett a(z) [name] teleptsvel. Az alkalmazst a ltrehozott ikonok kivlasztsval indthatja. -ClickFinish=Kattintson a 'Befejezs'-re a kilpshez. -FinishedRestartLabel=A(z) [name] teleptsnek befejezshez jra kell indtani a szmtgpet. jraindtja most? -FinishedRestartMessage=A(z) [name] teleptsnek befejezshez, a Teleptnek jra kell indtani a szmtgpet.%n%njraindtja most? -ShowReadmeCheck=Igen, szeretnm elolvasni a FONTOS fjlt -YesRadio=&Igen, jraindts most -NoRadio=&Nem, ksbb indtom jra +FinishedHeadingLabel=A(z) [name] telepítésének befejezése +FinishedLabelNoIcons=A Telepítő végzett a(z) [name] telepítésével. +FinishedLabel=A Telepítő végzett a(z) [name] telepítésével. Az alkalmazást a létrehozott ikonok kiválasztásával indíthatja. +ClickFinish=Kattintson a 'Befejezés'-re a kilépéshez. +FinishedRestartLabel=A(z) [name] telepítésének befejezéséhez újra kell indítani a számítógépet. Újraindítja most? +FinishedRestartMessage=A(z) [name] telepítésének befejezéséhez, a Telepítőnek újra kell indítani a számítógépet.%n%nÚjraindítja most? +ShowReadmeCheck=Igen, szeretném elolvasni a FONTOS fájlt +YesRadio=&Igen, újraindítás most +NoRadio=&Nem, később indítom újra ; used for example as 'Run MyProg.exe' -RunEntryExec=%1 futtatsa +RunEntryExec=%1 futtatása ; used for example as 'View Readme.txt' -RunEntryShellExec=%1 megtekintse +RunEntryShellExec=%1 megtekintése ; *** "Setup Needs the Next Disk" stuff -ChangeDiskTitle=A Teleptnek szksge van a kvetkez lemezre -SelectDiskLabel2=Helyezze be a(z) %1. lemezt s kattintson az 'OK'-ra.%n%nHa a fjlok a lemez egy a megjelentettl klnbz mappjban tallhatk, rja be a helyes tvonalat vagy kattintson a 'Tallzs'-ra. -PathLabel=&tvonal: -FileNotInDir2=A(z) "%1" fjl nem tallhat a kvetkez helyen: "%2". Helyezze be a megfelel lemezt vagy vlasszon egy msik mappt. -SelectDirectoryLabel=Adja meg a kvetkez lemez helyt. +ChangeDiskTitle=A Telepítőnek szüksége van a következő lemezre +SelectDiskLabel2=Helyezze be a(z) %1. lemezt és kattintson az 'OK'-ra.%n%nHa a fájlok a lemez egy a megjelenítettől különböző mappájában találhatók, írja be a helyes útvonalat vagy kattintson a 'Tallózás'-ra. +PathLabel=Ú&tvonal: +FileNotInDir2=A(z) "%1" fájl nem található a következő helyen: "%2". Helyezze be a megfelelő lemezt vagy válasszon egy másik mappát. +SelectDirectoryLabel=Adja meg a következő lemez helyét. ; *** Installation phase messages -SetupAborted=A telepts nem fejezdtt be.%n%nHrtsa el a hibt s futtassa jbl a Teleptt. -AbortRetryIgnoreSelectAction=Vlasszon mveletet -AbortRetryIgnoreRetry=&jra -AbortRetryIgnoreIgnore=&Hiba elvetse s folytats -AbortRetryIgnoreCancel=Telepts megszaktsa +SetupAborted=A telepítés nem fejeződött be.%n%nHárítsa el a hibát és futtassa újból a Telepítőt. +AbortRetryIgnoreSelectAction=Válasszon műveletet +AbortRetryIgnoreRetry=&Újra +AbortRetryIgnoreIgnore=&Hiba elvetése és folytatás +AbortRetryIgnoreCancel=Telepítés megszakítása ; *** Installation status messages -StatusClosingApplications=Alkalmazsok bezrsa... -StatusCreateDirs=Knyvtrak ltrehozsa... -StatusExtractFiles=Fjlok kibontsa... -StatusCreateIcons=Parancsikonok ltrehozsa... -StatusCreateIniEntries=INI bejegyzsek ltrehozsa... -StatusCreateRegistryEntries=Rendszerler bejegyzsek ltrehozsa... -StatusRegisterFiles=Fjlok regisztrlsa... -StatusSavingUninstall=Eltvolt informcik mentse... -StatusRunProgram=Telepts befejezse... -StatusRestartingApplications=Alkalmazsok jraindtsa... -StatusRollback=Vltoztatsok visszavonsa... +StatusClosingApplications=Alkalmazások bezárása... +StatusCreateDirs=Könyvtárak létrehozása... +StatusExtractFiles=Fájlok kibontása... +StatusCreateIcons=Parancsikonok létrehozása... +StatusCreateIniEntries=INI bejegyzések létrehozása... +StatusCreateRegistryEntries=Rendszerleíró bejegyzések létrehozása... +StatusRegisterFiles=Fájlok regisztrálása... +StatusSavingUninstall=Eltávolító információk mentése... +StatusRunProgram=Telepítés befejezése... +StatusRestartingApplications=Alkalmazások újraindítása... +StatusRollback=Változtatások visszavonása... ; *** Misc. errors -ErrorInternal2=Bels hiba: %1 +ErrorInternal2=Belső hiba: %1 ErrorFunctionFailedNoCode=Sikertelen %1 -ErrorFunctionFailed=Sikertelen %1; kd: %2 -ErrorFunctionFailedWithMessage=Sikertelen %1; kd: %2.%n%3 -ErrorExecutingProgram=Nem hajthat vgre a fjl:%n%1 +ErrorFunctionFailed=Sikertelen %1; kód: %2 +ErrorFunctionFailedWithMessage=Sikertelen %1; kód: %2.%n%3 +ErrorExecutingProgram=Nem hajtható végre a fájl:%n%1 ; *** Registry errors -ErrorRegOpenKey=Nem nyithat meg a rendszerler kulcs:%n%1\%2 -ErrorRegCreateKey=Nem hozhat ltre a rendszerler kulcs:%n%1\%2 -ErrorRegWriteKey=Nem mdosthat a rendszerler kulcs:%n%1\%2 +ErrorRegOpenKey=Nem nyitható meg a rendszerleíró kulcs:%n%1\%2 +ErrorRegCreateKey=Nem hozható létre a rendszerleíró kulcs:%n%1\%2 +ErrorRegWriteKey=Nem módosítható a rendszerleíró kulcs:%n%1\%2 ; *** INI errors -ErrorIniEntry=Bejegyzs ltrehozsa sikertelen a kvetkez INI fjlban: "%1". +ErrorIniEntry=Hiba lépett fel az INI bejegyzés során, ebben a fájlban: "%1". ; *** File copying errors -FileAbortRetryIgnoreSkipNotRecommended=&Fjl kihagysa (nem ajnlott) -FileAbortRetryIgnoreIgnoreNotRecommended=&Hiba elvetse s folytats (nem ajnlott) -SourceIsCorrupted=A forrsfjl megsrlt -SourceDoesntExist=A(z) "%1" forrsfjl nem ltezik -ExistingFileReadOnly2=A fjl csak olvashatknt van jellve. -ExistingFileReadOnlyRetry=Csak &olvashat tulajdonsg eltvoltsa s jra prblkozs -ExistingFileReadOnlyKeepExisting=&Ltez fjl megtartsa -ErrorReadingExistingDest=Hiba lpett fel a fjl olvassa kzben: -FileExists=A fjl mr ltezik.%n%nFell kvnja rni? -ExistingFileNewer=A ltez fjl jabb a teleptsre kerlnl. Ajnlott a ltez fjl megtartsa.%n%nMeg kvnja tartani a ltez fjlt? -ErrorChangingAttr=Hiba lpett fel a fjl attribtumnak mdostsa kzben: -ErrorCreatingTemp=Hiba lpett fel a fjl teleptsi knyvtrban trtn ltrehozsa kzben: -ErrorReadingSource=Hiba lpett fel a forrsfjl olvassa kzben: -ErrorCopying=Hiba lpett fel a fjl msolsa kzben: -ErrorReplacingExistingFile=Hiba lpett fel a ltez fjl cserje kzben: -ErrorRestartReplace=A fjl cserje az jraindts utn sikertelen volt: -ErrorRenamingTemp=Hiba lpett fel fjl teleptsi knyvtrban trtn tnevezse kzben: -ErrorRegisterServer=Nem lehet regisztrlni a DLL-t/OCX-et: %1 -ErrorRegSvr32Failed=Sikertelen RegSvr32. A visszaadott kd: %1 -ErrorRegisterTypeLib=Nem lehet regisztrlni a tpustrat: %1 +FileAbortRetryIgnoreSkipNotRecommended=&Fájl kihagyása (nem ajánlott) +FileAbortRetryIgnoreIgnoreNotRecommended=&Hiba elvetése és folytatás (nem ajánlott) +SourceIsCorrupted=A forrásfájl megsérült +SourceDoesntExist=A(z) "%1" forrásfájl nem létezik +ExistingFileReadOnly2=A fájl csak olvashatóként van jelölve, ezért nem cserélhető le. +ExistingFileReadOnlyRetry=Csak &olvasható tulajdonság eltávolítása és újra próbálkozás +ExistingFileReadOnlyKeepExisting=&Létező fájl megtartása +ErrorReadingExistingDest=Hiba lépett fel a fájl olvasása közben: +FileExistsSelectAction=Mit tegyünk? +FileExists2=A fájl már létezik. +FileExistsOverwriteExisting=A &létező fájl felülírása +FileExistsKeepExisting=A &már létező fájl megtartása +FileExistsOverwriteOrKeepAll=&Tegyük ezt, a következő fájlütközések esetén is +ExistingFileNewerSelectAction=Mit kíván tenni? +ExistingFileNewer2=A létező fájl újabb a telepítésre kerülőnél +ExistingFileNewerOverwriteExisting=A &létező fájl felülírása +ExistingFileNewerKeepExisting=&Tartsuk meg a létező fájlt (ajánlott) +ExistingFileNewerOverwriteOrKeepAll=&Tegyük ezt, a következő fájlütközések esetén is +ErrorChangingAttr=Hiba lépett fel a fájl attribútumának módosítása közben: +ErrorCreatingTemp=Hiba lépett fel a fájl telepítési könyvtárban történő létrehozása közben: +ErrorReadingSource=Hiba lépett fel a forrásfájl olvasása közben: +ErrorCopying=Hiba lépett fel a fájl másolása közben: +ErrorReplacingExistingFile=Hiba lépett fel a létező fájl cseréje közben: +ErrorRestartReplace=A fájl cseréje az újraindítás után sikertelen volt: +ErrorRenamingTemp=Hiba lépett fel fájl telepítési könyvtárban történő átnevezése közben: +ErrorRegisterServer=Nem lehet regisztrálni a DLL-t/OCX-et: %1 +ErrorRegSvr32Failed=Sikertelen RegSvr32. A visszaadott kód: %1 +ErrorRegisterTypeLib=Nem lehet regisztrálni a típustárat: %1 ; *** Uninstall display name markings ; used for example as 'My Program (32-bit)' @@ -314,53 +334,53 @@ UninstallDisplayNameMark=%1 (%2) UninstallDisplayNameMarks=%1 (%2, %3) UninstallDisplayNameMark32Bit=32-bit UninstallDisplayNameMark64Bit=64-bit -UninstallDisplayNameMarkAllUsers=Minden felhasznl -UninstallDisplayNameMarkCurrentUser=Jelenlegi felhasznl +UninstallDisplayNameMarkAllUsers=Minden felhasználó +UninstallDisplayNameMarkCurrentUser=Jelenlegi felhasználó ; *** Post-installation errors -ErrorOpeningReadme=Hiba lpett fel a FONTOS fjl megnyitsa kzben. -ErrorRestartingComputer=A Telept nem tudta jraindtani a szmtgpet. Indtsa jra kzileg. +ErrorOpeningReadme=Hiba lépett fel a FONTOS fájl megnyitása közben. +ErrorRestartingComputer=A Telepítő nem tudta újraindítani a számítógépet. Indítsa újra kézileg. ; *** Uninstaller messages -UninstallNotFound=A(z) "%1" fjl nem ltezik. Nem tvolthat el. -UninstallOpenError=A(z) "%1" fjl nem nyithat meg. Nem tvolthat el -UninstallUnsupportedVer=A(z) "%1" eltvoltsi naplfjl formtumt nem tudja felismerni az eltvolt jelen verzija. Az eltvolts nem folytathat -UninstallUnknownEntry=Egy ismeretlen bejegyzs (%1) tallhat az eltvoltsi naplfjlban -ConfirmUninstall=Biztosan el kvnja tvoltani a(z) %1 programot s minden sszetevjt? -UninstallOnlyOnWin64=Ezt a teleptst csak 64-bites Windowson lehet eltvoltani. -OnlyAdminCanUninstall=Ezt a teleptst csak adminisztrcis jogokkal rendelkez felhasznl tvolthatja el. -UninstallStatusLabel=Legyen trelemmel, amg a(z) %1 szmtgprl trtn eltvoltsa befejezdik. -UninstalledAll=A(z) %1 sikeresen el lett tvoltva a szmtgprl. -UninstalledMost=A(z) %1 eltvoltsa befejezdtt.%n%nNhny elemet nem lehetetett eltvoltani. Trlje kzileg. -UninstalledAndNeedsRestart=A(z) %1 eltvoltsnak befejezshez jra kell indtania a szmtgpt.%n%njraindtja most? -UninstallDataCorrupted=A(z) "%1" fjl srlt. Nem tvolthat el. +UninstallNotFound=A(z) "%1" fájl nem létezik. Nem távolítható el. +UninstallOpenError=A(z) "%1" fájl nem nyitható meg. Nem távolítható el +UninstallUnsupportedVer=A(z) "%1" eltávolítási naplófájl formátumát nem tudja felismerni az eltávolító jelen verziója. Az eltávolítás nem folytatható +UninstallUnknownEntry=Egy ismeretlen bejegyzés (%1) található az eltávolítási naplófájlban +ConfirmUninstall=Biztosan el kívánja távolítani a(z) %1 programot és minden összetevőjét? +UninstallOnlyOnWin64=Ezt a telepítést csak 64-bites Windows operációs rendszerről lehet eltávolítani. +OnlyAdminCanUninstall=Ezt a telepítést csak adminisztrációs jogokkal rendelkező felhasználó távolíthatja el. +UninstallStatusLabel=Legyen türelemmel, amíg a(z) %1 számítógépéről történő eltávolítása befejeződik. +UninstalledAll=A(z) %1 sikeresen el lett távolítva a számítógépről. +UninstalledMost=A(z) %1 eltávolítása befejeződött.%n%nNéhány elemet nem lehetettet eltávolítani. Törölje kézileg. +UninstalledAndNeedsRestart=A(z) %1 eltávolításának befejezéséhez újra kell indítania a számítógépét.%n%nÚjraindítja most? +UninstallDataCorrupted=A(z) "%1" fájl sérült. Nem távolítható el. ; *** Uninstallation phase messages -ConfirmDeleteSharedFileTitle=Trli a megosztott fjlt? -ConfirmDeleteSharedFile2=A rendszer azt jelzi, hogy a kvetkez megosztott fjlra mr nincs szksge egyetlen programnak sem. Eltvoltja a megosztott fjlt?%n%nHa ms programok mg mindig hasznljk a megosztott fjlt, akkor az eltvoltsa utn lehet, hogy nem fognak megfelelen mkdni. Ha bizonytalan, vlassza a Nemet. A fjl megtartsa nem okoz problmt a rendszerben. -SharedFileNameLabel=Fjlnv: +ConfirmDeleteSharedFileTitle=Törli a megosztott fájlt? +ConfirmDeleteSharedFile2=A rendszer azt jelzi, hogy a következő megosztott fájlra már nincs szüksége egyetlen programnak sem. Eltávolítja a megosztott fájlt?%n%nHa más programok még mindig használják a megosztott fájlt, akkor az eltávolítása után lehet, hogy nem fognak megfelelően működni. Ha bizonytalan, válassza a Nemet. A fájl megtartása nem okoz problémát a rendszerben. +SharedFileNameLabel=Fájlnév: SharedFileLocationLabel=Helye: -WizardUninstalling=Eltvolts llapota -StatusUninstalling=%1 eltvoltsa... +WizardUninstalling=Eltávolítás állapota +StatusUninstalling=%1 eltávolítása... ; *** Shutdown block reasons -ShutdownBlockReasonInstallingApp=%1 teleptse. -ShutdownBlockReasonUninstallingApp=%1 eltvoltsa. +ShutdownBlockReasonInstallingApp=%1 telepítése. +ShutdownBlockReasonUninstallingApp=%1 eltávolítása. ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] -NameAndVersion=%1, verzi: %2 -AdditionalIcons=Tovbbi parancsikonok: -CreateDesktopIcon=&Asztali ikon ltrehozsa -CreateQuickLaunchIcon=&Gyorsindts parancsikon ltrehozsa +NameAndVersion=%1, verzió: %2 +AdditionalIcons=További parancsikonok: +CreateDesktopIcon=&Asztali ikon létrehozása +CreateQuickLaunchIcon=&Gyorsindító parancsikon létrehozása ProgramOnTheWeb=%1 az interneten -UninstallProgram=Eltvolts - %1 -LaunchProgram=Indts %1 -AssocFileExtension=A(z) %1 &trstsa a(z) %2 fjlkiterjesztssel -AssocingFileExtension=A(z) %1 trstsa a(z) %2 fjlkiterjesztssel... -AutoStartProgramGroupDescription=Indtpult: -AutoStartProgram=%1 automatikus indtsa -AddonHostProgramNotFound=A(z) %1 nem tallhat a kivlasztott knyvtrban.%n%nMindenkppen folytatja? +UninstallProgram=Eltávolítás - %1 +LaunchProgram=Indítás %1 +AssocFileExtension=A(z) %1 &társítása a(z) %2 fájlkiterjesztéssel +AssocingFileExtension=A(z) %1 társítása a(z) %2 fájlkiterjesztéssel... +AutoStartProgramGroupDescription=Indítópult: +AutoStartProgram=%1 automatikus indítása +AddonHostProgramNotFound=A(z) %1 nem található a kiválasztott könyvtárban.%n%nMindenképpen folytatja? diff --git a/installer/innosetup/Languages/Icelandic.isl b/installer/innosetup/Languages/Icelandic.isl new file mode 100644 index 000000000..395a75761 --- /dev/null +++ b/installer/innosetup/Languages/Icelandic.isl @@ -0,0 +1,361 @@ +; *** Inno Setup version 6.1.0+ Icelandic messages *** +; +; Translator: Stefán Örvar Sigmundsson, eMedia Intellect +; Contact: emi@emi.is +; Date: 2020-07-25 + +[LangOptions] + +LanguageName=<00CD>slenska +LanguageID=$040F +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Uppsetning +SetupWindowTitle=Uppsetning - %1 +UninstallAppTitle=Niðurtaka +UninstallAppFullTitle=%1-niðurtaka + +; *** Misc. common +InformationTitle=Upplýsingar +ConfirmTitle=Staðfesta +ErrorTitle=Villa + +; *** SetupLdr messages +SetupLdrStartupMessage=Þetta mun uppsetja %1. Vilt þú halda áfram? +LdrCannotCreateTemp=Ófært um að skapa tímabundna skrá. Uppsetningu hætt +LdrCannotExecTemp=Ófært um að keyra skrá í tímabundna skráasafninu. Uppsetningu hætt +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nVilla %2: %3 +SetupFileMissing=Skrána %1 vantar úr uppsetningarskráasafninu. Vinsamlega leiðréttu vandamálið eða fáðu nýtt afrita af forritinu. +SetupFileCorrupt=Uppsetningarskrárnar eru spilltar. Vinsamlega fáðu nýtt afrita af forritinu. +SetupFileCorruptOrWrongVer=Uppsetningarskrárnar eru spilltar eða eru ósamrýmanlegar við þessa útgáfu af Uppsetningu. Vinsamlega leiðréttu vandamálið eða fáðu nýtt afrit af forritinu. +InvalidParameter=Ógild færibreyta var afhend á skipanalínunni:%n%n%1 +SetupAlreadyRunning=Uppsetning er nú þegar keyrandi. +WindowsVersionNotSupported=Þetta forrit styður ekki útgáfuna af Windows sem tölvan þín er keyrandi. +WindowsServicePackRequired=Þetta forrit krefst Þjónustupakka %2 eða síðari. +NotOnThisPlatform=Þetta forrit mun ekki keyra á %1. +OnlyOnThisPlatform=Þetta forrit verður að keyra á %1. +OnlyOnTheseArchitectures=Þetta forrit er einungis hægt að uppsetja á útgáfur af Windows hannaðar fyrir eftirfarandi gjörvahannanir:%n%n%1 +WinVersionTooLowError=Þetta forrit krefst %1-útgáfu %2 eða síðari. +WinVersionTooHighError=Þetta forrit er ekki hægt að uppsetja á %1-útgáfu %2 eða síðari. +AdminPrivilegesRequired=Þú verður að vera innskráð(ur) sem stjórnandi meðan þú uppsetur þetta forrit. +PowerUserPrivilegesRequired=Þú verður að vera innskráð(ur) sem stjórnandi eða sem meðlimur Power Users-hópsins meðan þú uppsetur þetta forrit. +SetupAppRunningError=Uppsetning hefur greint að %1 er eins og er keyrandi.%n%nVinsamlega lokaðu öllum tilvikum þess núna, smelltu síðan á Í lagi til að halda áfram eða Hætta við til að hætta. +UninstallAppRunningError=Niðurtaka hefur greint að %1 er eins og er keyrandi.%n%nVinsamlega lokaðu öllum tilvikum þess núna, smelltu síðan á Í lagi til að halda áfram eða Hætta við til að hætta. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Veldu uppsetningarham +PrivilegesRequiredOverrideInstruction=Veldu uppsetningarham +PrivilegesRequiredOverrideText1=%1 er hægt að setja upp fyrir alla notendur (krefst stjórnandaréttinda) eða fyrir þig einungis. +PrivilegesRequiredOverrideText2=%1 er hægt að setja upp fyrir þig einungis eða fyrir alla notendur (krefst stjórnandaréttinda). +PrivilegesRequiredOverrideAllUsers=Uppsetja fyrir &alla notendur +PrivilegesRequiredOverrideAllUsersRecommended=Uppsetja fyrir &alla notendur (ráðlagt) +PrivilegesRequiredOverrideCurrentUser=Uppsetja fyrir &mig einungis +PrivilegesRequiredOverrideCurrentUserRecommended=Uppsetja fyrir &mig einungis (ráðlagt) + +; *** Misc. errors +ErrorCreatingDir=Uppsetningunni var ófært um að skapa skráasafnið „%1“ +ErrorTooManyFilesInDir=Ófært um að skapa skrá í skráasafninu „%1“ vegna þess það inniheldur of margar skrár + +; *** Setup common messages +ExitSetupTitle=Hætta í Uppsetningu +ExitSetupMessage=Uppsetningu er ekki lokið. Ef þú hættir núna mun forritið ekki vera uppsett.%n%nÞú getur keyrt Uppsetningu aftur síðar til að ljúka uppsetningunni.%n%nHætta í Uppsetningu? +AboutSetupMenuItem=&Um Uppsetningu… +AboutSetupTitle=Um Uppsetningu +AboutSetupMessage=%1 útgáfa %2%n%3%n%n%1 heimasíðu:%n%4 +AboutSetupNote= +TranslatorNote=Stefán Örvar Sigmundsson, eMedia Intellect + +; *** Buttons +ButtonBack=< &Fyrri +ButtonNext=&Næst > +ButtonInstall=&Uppsetja +ButtonOK=Í lagi +ButtonCancel=Hætta við +ButtonYes=&Já +ButtonYesToAll=Já við &öllu +ButtonNo=&Nei +ButtonNoToAll=&Nei við öllu +ButtonFinish=&Ljúka +ButtonBrowse=&Vafra… +ButtonWizardBrowse=&Vafra… +ButtonNewFolder=&Skapa nýja möppu + +; *** "Select Language" dialog messages +SelectLanguageTitle=Veldu tungumál Uppsetningar +SelectLanguageLabel=Veldu tungumálið sem nota á við uppsetninguna. + +; *** Common wizard text +ClickNext=Smelltu á Næst til að halda áfram eða Hætta við til að hætta Uppsetningu. +BeveledLabel= +BrowseDialogTitle=Vafra eftir möppu +BrowseDialogLabel=Veldu möppu í listanum fyrir neðan, smelltu síðan á Í lagi. +NewFolderName=Ný mappa + +; *** "Welcome" wizard page +WelcomeLabel1=Velkomin(n) í [name]-uppsetningaraðstoðarann +WelcomeLabel2=Þetta mun uppsetja [name/ver] á þína tölvu.%n%nÞað er ráðlagt að þú lokir öllum öðrum hugbúnaði áður en haldið er áfram. + +; *** "Password" wizard page +WizardPassword=Aðgangsorð +PasswordLabel1=Þessi uppsetning er aðgangsorðsvarin. +PasswordLabel3=Vinsamlega veitu aðgangsorðið, smelltu síðan á Næst til að halda áfram. Aðgangsorð eru hástafanæm. +PasswordEditLabel=&Aðgangsorð: +IncorrectPassword=Aðgangsorðið sem þú innslóst er ekki rétt. Vinsamlega reyndu aftur. + +; *** "License Agreement" wizard page +WizardLicense=Leyfissamningur +LicenseLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. +LicenseLabel3=Vinsamlega lestu eftirfarandi leyfissamning. Þú verður að samþykkja skilmála samningsins áður en haldið er áfram með uppsetninguna. +LicenseAccepted=Ég &samþykki samninginn +LicenseNotAccepted=Ég samþykki &ekki samninginn + +; *** "Information" wizard pages +WizardInfoBefore=Upplýsingar +InfoBeforeLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. +InfoBeforeClickLabel=Þegar þú ert tilbúin(n) til að halda áfram með Uppsetninguna, smelltu á Næst. +WizardInfoAfter=Upplýsingar +InfoAfterLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. +InfoAfterClickLabel=Þegar þú ert tilbúin(n) til að halda áfram með Uppsetninguna, smelltu á Næst. + +; *** "User Information" wizard page +WizardUserInfo=Notandaupplýsingar +UserInfoDesc=Vinsamlega innsláðu upplýsingarnar þínar. +UserInfoName=&Notandanafn: +UserInfoOrg=&Stofnun: +UserInfoSerial=&Raðnúmer: +UserInfoNameRequired=Þú verður að innslá nafn. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Velja staðsetningu +SelectDirDesc=Hvar ætti [name] að vera uppsettur? +SelectDirLabel3=Uppsetning mun uppsetja [name] í hina eftirfarandi möppu. +SelectDirBrowseLabel=Til að halda áfram, smelltu á Næst. Ef þú vilt velja aðra möppu, smelltu á Vafra. +DiskSpaceGBLabel=Að minnsta kosti [gb] GB af lausu diskplássi er krafist. +DiskSpaceMBLabel=Að minnsta kosti [mb] MB af lausu diskplássi er krafist. +CannotInstallToNetworkDrive=Uppsetning getur ekki uppsett á netdrif. +CannotInstallToUNCPath=Uppsetning getur ekki uppsett á UNC-slóð. +InvalidPath=Þú verður að innslá fulla slóð með drifstaf; til dæmis:%n%nC:\APP%n%neða UNC-slóð samkvæmt sniðinu:%n%n\\server\share +InvalidDrive=Drifið eða UNC-deilingin sem þú valdir er ekki til eða er ekki aðgengileg. Vinsamlega veldu annað. +DiskSpaceWarningTitle=Ekki nóg diskpláss +DiskSpaceWarning=Uppsetning krefst að minnsta kosti %1 KB af lausu plássi til að uppsetja, en hið valda drif hefur einungis %2 KB tiltæk.%n%nVilt þú halda áfram hvort sem er? +DirNameTooLong=Möppunafnið eða slóðin er of löng. +InvalidDirName=Möppunafnið er ekki gilt. +BadDirName32=Möppunöfn geta ekki innihaldið nein af hinum eftirfarandi rittáknum:%n%n%1 +DirExistsTitle=Mappa er til +DirExists=Mappan:%n%n%1%n%ner nú þegar til. Vilt þú uppsetja í þá möppu hvort sem er? +DirDoesntExistTitle=Mappa er ekki til +DirDoesntExist=Mappan:%n%n%1%n%ner ekki til. Vilt þú að mappan sé sköpuð? + +; *** "Select Components" wizard page +WizardSelectComponents=Velja atriði +SelectComponentsDesc=Hvaða atriði ætti að uppsetja? +SelectComponentsLabel2=Veldu atriðin sem þú vilt uppsetja; hreinsaðu atriðin sem þú vilt ekki uppsetja. Smelltu á Næst þegar þú ert tilbúin(n) til að halda áfram. +FullInstallation=Full uppsetning +CompactInstallation=Samanþjöppuð uppsetning +CustomInstallation=Sérsnídd uppsetning +NoUninstallWarningTitle=Atriði eru til +NoUninstallWarning=Uppsetning hefur greint það að eftirfarandi atriði eru nú þegar uppsett á tölvunni þinni:%n%n%1%n%nAð afvelja þessi atriði mun ekki niðurtaka þau.%n%nVilt þú halda áfram hvort sem er? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Núverandi val krefst að minnsta kosti [gb] GB af diskplássi. +ComponentsDiskSpaceMBLabel=Núverandi val krefst að minnsta kosti [mb] MB af diskplássi. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Veldu aukaleg verk +SelectTasksDesc=Hvaða aukalegu verk ættu að vera framkvæmd? +SelectTasksLabel2=Veldu hin aukalegu verk sem þú vilt að Uppsetning framkvæmi meðan [name] er uppsettur, ýttu síðan á Næst. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Veldu Upphafsvalmyndarmöppu +SelectStartMenuFolderDesc=Hvert ætti Uppsetning að setja skyndivísa forritsins? +SelectStartMenuFolderLabel3=Uppsetning mun skapa skyndivísa forritsins í hina eftirfarandi Upphafsvalmyndarmöppu. +SelectStartMenuFolderBrowseLabel=Til að halda áfram, smelltu á Næst. Ef þú vilt velja aðra möppu, smelltu á Vafra. +MustEnterGroupName=Þú verður að innslá möppunafn. +GroupNameTooLong=Möppunafnið eða slóðin er of löng. +InvalidGroupName=Möppunafnið er ekki gilt. +BadGroupName=Möppunafnið getur ekki innihaldið neitt af hinum eftirfarandi rittáknum:%n%n%1 +NoProgramGroupCheck2=&Ekki skapa Upphafsvalmyndarmöppu + +; *** "Ready to Install" wizard page +WizardReady=Tilbúin til að uppsetja +ReadyLabel1=Uppsetning er núna tilbúin til að hefja uppsetningu [name] á tölvuna þína. +ReadyLabel2a=Smelltu á Uppsetja til að halda áfram uppsetningunni eða smelltu á Til baka ef þú vilt endurskoða eða breyta einhverjum stillingum. +ReadyLabel2b=Smelltu á Uppsetja til að halda áfram uppsetningunni. +ReadyMemoUserInfo=Notandaupplýsingar: +ReadyMemoDir=Staðsetning: +ReadyMemoType=Uppsetningartegund: +ReadyMemoComponents=Valin atriði: +ReadyMemoGroup=Upphafsvalmyndarmappa: +ReadyMemoTasks=Aukaleg verk: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Niðurhlaðandi aukalegum skrám… +ButtonStopDownload=&Stöðva niðurhleðslu +StopDownload=Ert þú viss um að þú viljir stöðva niðurhleðsluna? +ErrorDownloadAborted=Niðurhleðslu hætt +ErrorDownloadFailed=Niðurhleðsla mistókst: %1 %2 +ErrorDownloadSizeFailed=Mistókst að sækja stærð: %1 %2 +ErrorFileHash1=Skráarhakk mistókst: %1 +ErrorFileHash2=Ógilt skráarhakk: bjóst við %1, fékk %2 +ErrorProgress=Ógild framvinda: %1 of %2 +ErrorFileSize=Ógild skráarstærð: bjóst við %1, fékk %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Undirbúandi uppsetningu +PreparingDesc=Uppsetning er undirbúandi uppsetningu [name] á tölvuna þína. +PreviousInstallNotCompleted=Uppsetningu/Fjarlægingu eftirfarandi forrits var ekki lokið. Þú þarft að endurræsa tölvuna þína til að ljúka þeirri uppsetningu.%n%nEftir endurræsingu tölvunnar þinnar, keyrðu Uppsetningu aftur til að ljúka uppsetningu [name]. +CannotContinue=Uppsetning getur ekki haldið áfram. Vinsamlega smelltu á Hætta við til að hætta. +ApplicationsFound=Eftirfarandi hugbúnaður er notandi skrár sem þurfa að vera uppfærðar af Uppsetningu. Það er ráðlagt að þú leyfir Uppsetningu sjálfvirkt að loka þessum hugbúnaði. +ApplicationsFound2=Eftirfarandi hugbúnaður er notandi skrár sem þurfa að vera uppfærðar af Uppsetningu. Það er ráðlagt að þú leyfir Uppsetningu sjálfvirkt að loka þessum hugbúnaði. Eftir að uppsetningunni lýkur mun Uppsetning reyna að endurræsa hugbúnaðinn. +CloseApplications=&Sjálfvirkt loka hugbúnaðinum +DontCloseApplications=&Ekki loka hugbúnaðinum +ErrorCloseApplications=Uppsetningu var ófært um að sjálfvirkt loka öllum hugbúnaði. Það er ráðlagt að þú lokir öllum hugbúnaði notandi skrár sem þurfa að vera uppfærðar af Uppsetningu áður en haldið er áfram. +PrepareToInstallNeedsRestart=Þú verður að endurræsa tölvuna þína. Eftir að hafa endurræst tölvuna þína, keyrðu Uppsetningu aftur til að ljúka uppsetningu [name].%n%nVilt þú endurræsa núna? + +; *** "Installing" wizard page +WizardInstalling=Uppsetjandi +InstallingLabel=Vinsamlega bíddu meðan Uppsetning uppsetur [name] á tölvuna þína. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Ljúkandi [name]-uppsetningaraðstoðaranum +FinishedLabelNoIcons=Uppsetning hefur lokið uppsetningu [name] á tölvuna þína. +FinishedLabel=Uppsetning hefur lokið uppsetningu [name] á þinni tölvu. Hugbúnaðurinn getur verið ræstur með því að velja hina uppsettu skyndivísa. +ClickFinish=Smelltu á Ljúka til að hætta í Uppsetningu. +FinishedRestartLabel=Til að ljúka uppsetningu [name] þarft Uppsetning að endurræsa tölvuna þína. Vilt þú endurræsa núna? +FinishedRestartMessage=Til að ljúka uppsetningu [name] þarf Uppsetning að endurræsa tölvuna þína.%n%nVilt þú endurræsa núna? +ShowReadmeCheck=Já, ég vil skoða README-skrána +YesRadio=&Já, endurræsa tölvuna núna +NoRadio=&Nei, ég mun endurræsa tölvuna síðar +RunEntryExec=Keyra %1 +RunEntryShellExec=Skoða %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Uppsetning þarfnast næsta disks +SelectDiskLabel2=Vinsamlega settu inn disk %1 og smelltu á Í lagi.%n%nEf skrárnar á þessum disk er hægt að finna í annarri möppu en þeirri sem birt er fyrir neðan, innsláðu réttu slóðina og smelltu á Vafra. +PathLabel=&Slóð: +FileNotInDir2=Skrána „%1“ var ekki hægt að staðsetja í „%2“. Vinsamlega settu inn rétta diskinn eða veldu aðra möppu. +SelectDirectoryLabel=Vinsamlega tilgreindu staðsetningu næsta disks. + +; *** Installation phase messages +SetupAborted=Uppsetningu var ekki lokið.%n%nVinsamlega leiðréttu vandamálið og keyrðu Uppsetningu aftur. +AbortRetryIgnoreSelectAction=Velja aðgerð +AbortRetryIgnoreRetry=&Reyna aftur +AbortRetryIgnoreIgnore=&Hunsa villuna og halda áfram +AbortRetryIgnoreCancel=Hætta við uppsetningu + +; *** Installation status messages +StatusClosingApplications=Lokandi hugbúnaði… +StatusCreateDirs=Skapandi skráasöfn… +StatusExtractFiles=Útdragandi skrár… +StatusCreateIcons=Skapandi skyndivísa… +StatusCreateIniEntries=Skapandi INI-færslur… +StatusCreateRegistryEntries=Skapandi Windows Registry-færslur… +StatusRegisterFiles=Skrásetjandi skrár… +StatusSavingUninstall=Vistandi niðurtekningarupplýsingar… +StatusRunProgram=Ljúkandi uppsetningu… +StatusRestartingApplications=Endurræsandi hugbúnað… +StatusRollback=Rúllandi aftur breytingum… + +; *** Misc. errors +ErrorInternal2=Innri villa: %1 +ErrorFunctionFailedNoCode=%1 mistókst +ErrorFunctionFailed=%1 mistókst; kóði %2 +ErrorFunctionFailedWithMessage=%1 mistókst; kóði %2.%n%3 +ErrorExecutingProgram=Ófært um að keyra skrá:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Villa við opnun Windows Registry-lykils:%n%1\%2 +ErrorRegCreateKey=Villa við sköpun Windows Registry-lykils:%n%1\%2 +ErrorRegWriteKey=Villa við ritun í Windows Registry-lykil:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Villa við sköpun INI-færslu í skrána „%1“. + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Sleppa þessari skrá (ekki ráðlagt) +FileAbortRetryIgnoreIgnoreNotRecommended=&Hunsa villuna og halda áfram (ekki ráðlagt) +SourceIsCorrupted=Upprunaskráin er spillt +SourceDoesntExist=Upprunaskráin „%1“ er ekki til +ExistingFileReadOnly2=Hina gildandi skrá var ekki hægt að yfirrita því hún er merkt sem lesa-einungis. +ExistingFileReadOnlyRetry=&Fjarlægja lesa-einungis eigindi og reyna aftur +ExistingFileReadOnlyKeepExisting=&Halda gildandi skrá +ErrorReadingExistingDest=Villa kom upp meðan reynt var að lesa gildandi skrána: +FileExistsSelectAction=Velja aðgerð +FileExists2=Skráin er nú þegar til. +FileExistsOverwriteExisting=&Yfirrita hina gildandi skrá +FileExistsKeepExisting=&Halda hinni gildandi skrá +FileExistsOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður +ExistingFileNewerSelectAction=Velja aðgerð +ExistingFileNewer2=Hin gildandi skrá er nýrri en sú sem Uppsetning er að reyna að uppsetja. +ExistingFileNewerOverwriteExisting=&Yfirrita hina gildandi skrá +ExistingFileNewerKeepExisting=&Halda hinni gildandi skrá (ráðlagt) +ExistingFileNewerOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður +ErrorChangingAttr=Villa kom upp meðan reynt var að breyta eigindum gildandi skráarinnar: +ErrorCreatingTemp=Villa kom upp meðan reynt var að skapa skrá í staðsetningarskráasafninu: +ErrorReadingSource=Villa kom upp meðan reynt var að lesa upprunaskrána: +ErrorCopying=Villa kom upp meðan reynt var að afrita skrána: +ErrorReplacingExistingFile=Villa kom upp meðan reynt var að yfirrita gildandi skrána: +ErrorRestartReplace=RestartReplace mistókst: +ErrorRenamingTemp=Villa kom upp meðan reynt var að endurnefna skrá í staðsetningarskráasafninu: +ErrorRegisterServer=Ófært um að skrá DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 mistókst með skilakóðann %1 +ErrorRegisterTypeLib=Ófært um að skrá tegundasafnið: $1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bita +UninstallDisplayNameMark64Bit=64-bita +UninstallDisplayNameMarkAllUsers=Allir notendur +UninstallDisplayNameMarkCurrentUser=Núverandi notandi + +; *** Post-installation errors +ErrorOpeningReadme=Villa kom upp meðan reynt var að opna README-skrána. +ErrorRestartingComputer=Uppsetningu tókst ekki að endurræsa tölvuna. Vinsamlega gerðu þetta handvirkt. + +; *** Uninstaller messages +UninstallNotFound=Skráin „%1“ er ekki til. Getur ekki niðurtekið. +UninstallOpenError=Skrána „%1“ var ekki hægt að opna. Getur ekki niðurtekið +UninstallUnsupportedVer=Niðurtökuatburðaskráin „%1“ er á sniði sem er ekki þekkt af þessari útgáfu af niðurtakaranum. Getur ekki niðurtekið +UninstallUnknownEntry=Óþekkt færsla (%1) var fundin í niðurtökuatburðaskránni +ConfirmUninstall=Ert þú viss um að þú viljir algjörlega fjarlægja %1 og öll atriði þess? +UninstallOnlyOnWin64=Þessa uppsetningu er einungis hægt að niðurtaka á 64-bita Windows. +OnlyAdminCanUninstall=Þessi uppsetning getur einungis verið niðurtekin af notanda með stjórnandaréttindi. +UninstallStatusLabel=Vinsamlega bíddu meðan %1 er fjarlægt úr tölvunni þinni. +UninstalledAll=%1 var færsællega fjarlægt af tölvunni þinni. +UninstalledMost=%1-niðurtöku lokið.%n%nSuma liði var ekki hægt að fjarlægja. Þá er hægt að fjarlægja handvirkt. +UninstalledAndNeedsRestart=Til að ljúka niðurtöku %1 þarf að endurræsa tölvuna þína.%n%nVilt þú endurræsa núna? +UninstallDataCorrupted=„%1“-skráin er spillt. Getur ekki niðurtekið + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Fjarlægja deilda skrá? +ConfirmDeleteSharedFile2=Kerfið gefur til kynna að hin eftirfarandi deilda skrá er ekki lengur í notkun hjá neinu forriti. Vilt þú að Niðurtakari fjarlægi þessa deildu skrá?%n%nEf einhver forrit eru enn notandi þessa skrá og hún er fjarlægð, kann að vera að þau forrit munu ekki virka almennilega. Ef þú ert óviss, veldu Nei. Að skilja skrána eftir á kerfinu þínu mun ekki valda skaða. +SharedFileNameLabel=Skráarnafn: +SharedFileLocationLabel=Staðsetning: +WizardUninstalling=Niðurtökustaða +StatusUninstalling=Niðurtakandi %1… + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Uppsetjandi %1. +ShutdownBlockReasonUninstallingApp=Niðurtakandi %1. + +[CustomMessages] + +NameAndVersion=%1 útgáfa %2 +AdditionalIcons=Aukalegir skyndivísir: +CreateDesktopIcon=Skapa &skjáborðsskyndivísi +CreateQuickLaunchIcon=Skapa &Skyndiræsitáknmynd +ProgramOnTheWeb=%1 á Vefnum +UninstallProgram=Niðurtaka %1 +LaunchProgram=Ræsa %1 +AssocFileExtension=&Tengja %1 við %2-skráarframlenginguna +AssocingFileExtension=&Tengjandi %1 við %2-skráarframlenginguna… +AutoStartProgramGroupDescription=Ræsing: +AutoStartProgram=Sjálfvikt ræsa %1 +AddonHostProgramNotFound=%1 gat ekki staðsett möppuna sem þú valdir.%n%nVilt þú halda áfram hvort sem er? \ No newline at end of file diff --git a/installer/innosetup/Languages/Indonesian.isl b/installer/innosetup/Languages/Indonesian.isl index b86e81e26..2dfc1c38c 100644 --- a/installer/innosetup/Languages/Indonesian.isl +++ b/installer/innosetup/Languages/Indonesian.isl @@ -1,364 +1,343 @@ -; *** Inno Setup version 6.0.3+ Indonesian messages *** +; *** Inno Setup version 6.1.0+ Indonesian messages *** ; -; Untuk mengunduh berkas terjemahan hasil konstribusi pengguna, kunjungi: +; Untuk mengunduh terjemahan kontribusi-pengguna dari berkas ini, buka: ; http://www.jrsoftware.org/files/istrans/ -; +; ; Alih bahasa oleh: MozaikTM (mozaik.tm@gmail.com) -; -; Catatan: Saat menerjemahkan pesan ini, jangan masukkan titik (.) pada -; akhir pesan tanpa titik, karena Inno Setup menambahkan titik pada pesan tersebut -; secara otomatis (menambahkan sebuah titik akan memunculkan dua titik). [LangOptions] -; Tiga baris berikut sangat penting. Pastikan untuk membaca dan -; memahami topik 'bagian [LangOption]' dalam berkas bantuan. LanguageName=Bahasa Indonesia LanguageID=$0421 LanguageCodePage=0 -; Bila target bahasa Anda memerlukan fon atau ukuran khusus, -; hapus tanda komentar (;) dari salah satu atau beberapa baris berikut dan ubah seperlunya. -;DialogFontName= -;DialogFontSize=8 -;WelcomeFontName=Verdana -;WelcomeFontSize=12 -;TitleFontName=Arial -;TitleFontSize=29 -;CopyrightFontName=Arial -;CopyrightFontSize=8 [Messages] - -; *** Judul aplikasi -SetupAppTitle=Pemasang -SetupWindowTitle=Pemasangan %1 +SetupAppTitle=Instalasi +SetupWindowTitle=Instalasi - %1 UninstallAppTitle=Pelepas UninstallAppFullTitle=Pelepasan %1 -; *** Misc. common InformationTitle=Informasi ConfirmTitle=Konfirmasi -ErrorTitle=Ada Masalah +ErrorTitle=Galat -; *** Pesan untuk SetupLdr -SetupLdrStartupMessage=Kami akan memasang %1. Lanjutkan? -LdrCannotCreateTemp=Tidak dapat membuat berkas sementara. Pemasangan dibatalkan -LdrCannotExecTemp=Tidak dapat mengeksekusi berkas di dalam direktori sementara. Pemasangan dibatalkan -HelpTextNote= +SetupLdrStartupMessage=Kami akan memasang %1. Teruskan? +LdrCannotCreateTemp=Tidak dapat membuat berkas sementara. Batal memasang +LdrCannotExecTemp=Tidak dapat menjalankan berkas di direktori sementara. Batal memasang -; *** Pesan kesalahan saat memuat Pemasang -LastErrorMessage=%1.%n%nKesalahan %2: %3 -SetupFileMissing=Berkas %1 hilang dari lokasi pemasangan. Silakan selesaikan masalah atau dapatkan salinan baru dari pemasang ini. -SetupFileCorrupt=Berkas Pemasang telah rusak. Silakan dapatkan salinan baru dari pemasang ini. -SetupFileCorruptOrWrongVer=Berkas-berkas pemasang telah rusak, atau tidak cocok dengan versi pemasang ini. Silakan selesaikan masalah atau dapatkan salinan baru dari berkas ini. -InvalidParameter=Ada parameter tidak sah pada baris perintah:%n%n%1 -SetupAlreadyRunning=Pemasang sudah berjalan. -WindowsVersionNotSupported=Program ini tidak mendukung Windows yang terpasang pada komputer ini. +LastErrorMessage=%1.%n%nGalat %2: %3 +SetupFileMissing=Berkas %1 hilang dari direktori instalasi. Silakan koreksi masalah atau dapatkan salinan program yang baru. +SetupFileCorrupt=Berkas pemandu telah rusak. Silakan dapatkan salinan program yang baru. +SetupFileCorruptOrWrongVer=Berkas pemandu telah rusak, atau tidak cocok dengan versi pemandu ini. Silakan koreksi masalah atau dapatkan salinan program yang baru. +InvalidParameter=Parameter tak sah terdapat pada baris perintah: %n%n%1 +SetupAlreadyRunning=Pemandu sudah berjalan. +WindowsVersionNotSupported=Program ini tidak mendukung versi Windows yang berjalan pada komputer Anda. WindowsServicePackRequired=Program ini memerlukan %1 Service Pack %2 atau yang terbaru. NotOnThisPlatform=Program ini tidak akan berjalan pada %1. OnlyOnThisPlatform=Program ini harus dijalankan pada %1. -OnlyOnTheseArchitectures=Program ini hanya dapat dipasang pada versi Windows yang didesain untuk arsitektur prosesor berikut:%n%n%1 +OnlyOnTheseArchitectures=Program ini hanya bisa dipasang pada versi Windows yang didesain untuk arsitektur prosesor berikut:%n%n%1 WinVersionTooLowError=Program ini memerlukan %1 versi %2 atau yang terbaru. WinVersionTooHighError=Program ini tidak dapat dipasang pada %1 versi %2 atau yang terbaru. -AdminPrivilegesRequired=Anda wajib masuk sebagai seorang administrator saat memasang program ini. -PowerUserPrivilegesRequired=Anda wajib masuk sebagai seorang administrator atau pengguna dari grup Power Users saat memasang program ini. -SetupAppRunningError=Pemasang mendeteksi bahwa %1 sedang berjalan.%n%nSilakan tutup semua program terkait, kemudian klik OK untuk lanjut, atau Batal untuk keluar. -UninstallAppRunningError=Pelepas mendeteksi bahwa %1 sedang berjalan.%n%nSilakan tutup semua program terkait, kemudian klik OK untuk lanjut, atau Batal untuk keluar. +AdminPrivilegesRequired=Anda harus masuk sebagai seorang administrator saat memasang program ini. +PowerUserPrivilegesRequired=Anda harus masuk sebagai seorang administrator atau anggota grup Power Users saat memasang program ini. +SetupAppRunningError=Kami mendeteksi bahwa %1 sedang berjalan.%n%nSilakan tutup semua instansi bersangkutan, lalu klik OK untuk meneruskan, atau Cancel untuk keluar. +UninstallAppRunningError=Pelepas mendeteksi bahwa %1 sedang berjalan.%n%nSilakan tutup semua instansi bersangkutan, lalu klik OK untuk meneruskan, atau Cancel untuk keluar. -; *** Pertanyaan saat memuat Pemasang -PrivilegesRequiredOverrideTitle=Pilih Mode Pemasang -PrivilegesRequiredOverrideInstruction=Pilih mode pemasangan -PrivilegesRequiredOverrideText1=%1 bisa dipasang untuk semua pengguna (perlu izin administratif), atau hanya untuk Anda. -PrivilegesRequiredOverrideText2=%1 bisa dipasang hanya untuk Anda, atau untuk semua pengguna (perlu izin administratif). +;Inno6 +PrivilegesRequiredOverrideTitle=Pilih Mode Instalasi +PrivilegesRequiredOverrideInstruction=Pilih mode instalasi +PrivilegesRequiredOverrideText1=%1 bisa dipasang untuk semua pengguna (perlu izin administratif), atau hanya Anda. +PrivilegesRequiredOverrideText2=%1 bisa dipasang hanya untuk Anda, atau semua pengguna (perlu izin administratif). PrivilegesRequiredOverrideAllUsers=Pasang untuk &semua pengguna PrivilegesRequiredOverrideAllUsersRecommended=Pasang untuk &semua pengguna (disarankan) -PrivilegesRequiredOverrideCurrentUser=Pasang hanya untuk saya -PrivilegesRequiredOverrideCurrentUserRecommended=Pasang hanya untuk saya (disarankan) +PrivilegesRequiredOverrideCurrentUser=Pasang &hanya untuk saya +PrivilegesRequiredOverrideCurrentUserRecommended=Pasang &hanya untuk saya (disarankan) +;Inno6 -; *** Macam-macam galat -ErrorCreatingDir=Pemasang tidak dapat membuat direktori "%1" -ErrorTooManyFilesInDir=Tidak dapat membuat berkas dalam direktori "%1" karena berisi terlalu banyak berkas. +ErrorCreatingDir=Kami tidak dapat membuat direktori "%1" +ErrorTooManyFilesInDir=Tidak dapat membuat berkas di direktori "%1" karena berisi terlalu banyak berkas -; *** Pesan umum pada Pemasamg -ExitSetupTitle=Tutup Pemasang -ExitSetupMessage=Pemasangan tidak lengkap. Bila Anda keluar sekarang, program tidak akan terpasang.%n%nAnda dapat menjalankan kembali Pemasang ini lain kali untuk melengkapi pemasangan.%n%nTutup Pemasang? -AboutSetupMenuItem=&Tentang Pemasang .... -AboutSetupTitle=Tentang Pemasang -AboutSetupMessage=%1 versi %2%n%3%n%n%1 laman muka:%n%4 +ExitSetupTitle=Keluar Pemandu +ExitSetupMessage=Instalasi tidak lengkap. Bila Anda keluar sekarang, program takkan terpasang.%n%nAnda bisa menjalankan Pemandu lagi lain kali untuk melengkapinya.%n%nKeluar? +AboutSetupMenuItem=&Tentang Pemandu... +AboutSetupTitle=Tentang Pemandu +AboutSetupMessage=%1 versi %2%n%3%n%n%1 laman beranda:%n%4 AboutSetupNote= -TranslatorNote=Bila Anda menemukan typo (kesalahan pengetikan), terjemahan yang salah atau kurang tepat, atau Anda ingin mendapatkan terjemahan untuk versi lawas, silakan kirimkan surel (email) ke mozaik(dot)tm(at)gmail(dot)com +TranslatorNote= -; *** Tombol-tombol -ButtonBack=< &Sebelumnya -ButtonNext=&Berikutnya > +ButtonBack=&Kembali +ButtonNext=&Maju ButtonInstall=&Pasang -ButtonOK=OK +ButtonOK=Oke ButtonCancel=Batal -ButtonYes=&Iya -ButtonYesToAll=Iya &semuanya +ButtonYes=&Ya +ButtonYesToAll=Y&a semuanya ButtonNo=&Tidak -ButtonNoToAll=&Tidak semuanya +ButtonNoToAll=T&idak semuanya ButtonFinish=&Selesai -ButtonBrowse=&Jelajahi .... -ButtonWizardBrowse=J&elajahi .... +ButtonBrowse=&Cari... +ButtonWizardBrowse=C&ari... ButtonNewFolder=&Buat Map Baru -; *** Halaman "Pilih Bahasa" -SelectLanguageTitle=Pilih Bahasa Pemasang -SelectLanguageLabel=Pilih bahasa untuk digunakan selama pemasangan. +SelectLanguageTitle=Pilih Bahasa Pemandu +SelectLanguageLabel=Pilih bahasa untuk digunakan ketika memasang. -; *** Pesan umum pada Pemasang -ClickNext=Klik Berikutnya untuk melanjutkan, atau Batal untuk menutup Pemasang. +ClickNext=Klik Maju untuk meneruskan, atau Batal untuk keluar. BeveledLabel= -BrowseDialogTitle=Pilih Map -BrowseDialogLabel=Pilih satu map dalam daftar di bawah, kemudian klik OK. +BrowseDialogTitle=Cari Map +BrowseDialogLabel=Pilih map dari daftar berikut, lalu klik OK. NewFolderName=Map Baru -; *** Halaman "Selamat Datang" -WelcomeLabel1=Selamat datang di Asisten Pemasangan [name] -WelcomeLabel2=Kami akan memasang [name/ver] pada komputer Anda.%n%nAnda disarankan untuk menutup semua aplikasi sebelum melanjutkan. +WelcomeLabel1=Selamat datang di Pemandu Instalasi [name] +WelcomeLabel2=Kami akan memasang [name/ver] pada komputer Anda.%n%nDisarankan untuk menutup semua aplikasi lainnya sebelum meneruskan. -; *** Halaman "Kata Sandi" WizardPassword=Kata Sandi -PasswordLabel1=Pemasang ini dilindungi kata sandi. -PasswordLabel3=Silakan masukkan kata sandi, lalu klik Berikutnya untuk melanjutkan. Kata sandi bersifat sensitif kapitalisasi. +PasswordLabel1=Instalasi ini dilindungi kata sandi. +PasswordLabel3=Silakan masukkan kata sandi, lalu klik Maju untuk meneruskan. Kata sandi bersifat sensitif-kapitalisasi. PasswordEditLabel=&Kata Sandi: IncorrectPassword=Kata sandi yang Anda masukkan salah. Silakan coba lagi. -; *** Halaman "Kesepakatan Lisensi" WizardLicense=Kesepakatan Lisensi -LicenseLabel=Silakan baca informasi penting berikut sebelum melanjutkan. -LicenseLabel3=Silakan baca Kesepakatan Lisensi berikut. Anda wajib menyetujui syarat-syarat kesepakatan ini sebelum melanjutkan pemasangan. -LicenseAccepted=Saya &setuju dengan kesepakatan ini -LicenseNotAccepted=Saya &tidak setuju dengan kesepakatan ini +LicenseLabel=Silakan baca informasi berikut sebelum meneruskan. +LicenseLabel3=Silakan baca Kesepakatan Lisensi berikut. Anda harus setuju dengan syarat dari kesepakatan ini sebelum meneruskan instalasi. +LicenseAccepted=Saya &setujui kesepakatan ini +LicenseNotAccepted=Saya &tidak setuju kesepakatan ini -; *** Halaman "Informasi" WizardInfoBefore=Informasi -InfoBeforeLabel=Silakan baca informasi penting berikut sebelum melanjutkan. -InfoBeforeClickLabel=Bila Anda sudah siap melanjutkan pemasangan, klik Berikutnya. +InfoBeforeLabel=Silakan baca informasi penting berikut sebelum meneruskan. +InfoBeforeClickLabel=Saat Anda siap meneruskan instalasi, klik Maju. WizardInfoAfter=Informasi -InfoAfterLabel=Silakan baca informasi penting berikut sebelum melanjutkan. -InfoAfterClickLabel=Bila Anda sudah siap melanjutkan pemasangan, klik Berikutnya. +InfoAfterLabel=Silakan baca informasi penting berikut sebelum meneruskan. +InfoAfterClickLabel=Saat Anda siap meneruskan instalasi, klik Maju. -; *** Halaman "Informasi Pengguna" WizardUserInfo=Informasi Pengguna UserInfoDesc=Silakan masukkan informasi Anda. UserInfoName=&Nama Pengguna: UserInfoOrg=&Organisasi: -UserInfoSerial=Nomor Seri: -UserInfoNameRequired=Anda wajib memasukkan nama. +UserInfoSerial=&Nomor Seri: +UserInfoNameRequired=Wajib memasukkan nama. -; *** Halaman "Pilih Lokasi Pemasangan" -WizardSelectDir=Pilih Lokasi Pemasangan +WizardSelectDir=Pilih Lokasi Tujuan SelectDirDesc=Di manakah [name] sebaiknya dipasang? -SelectDirLabel3=Kami akan memasang [name] di dalam map berikut. -SelectDirBrowseLabel=Klik Berikutnya untuk melanjutkan. Bila Anda ingin memilih map lain, klik Jelajahi. -DiskSpaceGBLabel=Diperlukan sedikitnya [gb] GB ruang kosong. -DiskSpaceMBLabel=Diperlukan sedikitnya [mb] MB ruang kosong. -CannotInstallToNetworkDrive=Kami tidak dapat memasang pada kandar jaringan. -CannotInstallToUNCPath=Kami tidak dapat memasang pada lokasi UNC. -InvalidPath=Anda wajib memasukkan lokasi map lengkap dengan nama kandar; misalnya:%n%nC:\APP%n%natau sebuah alamat UNC dengan format:%n%n\\server\share -InvalidDrive=Kandar atau alamat UNC yang Anda pilih tidak ada atau tidak dapat diakses. Silakan pilih yang lain. -DiskSpaceWarningTitle=Ruang Kosong Tidak Mencukupi -DiskSpaceWarning=Pemasang memerlukan sedikitnya %1 KB ruang kosong, tetapi kandar terpilih hanya memiliki %2 KB tersedia.%n%nTetap lanjutkan? -DirNameTooLong=Alamat atau nama map terlalu panjang. -InvalidDirName=Nama map ini tidak sah. -BadDirName32=Nama map dilarang berisi karakter berikut:%n%n%1 +SelectDirLabel3=Kami akan memasang [name] ke dalam map berikut. +SelectDirBrowseLabel=Untuk meneruskan, klik Maju. Bila Anda ingin memilih map lain, klik Cari. +;Inno6 +DiskSpaceGBLabel=Diperlukan sedikitnya [gb] GB ruang bebas. +;Inno6 +DiskSpaceMBLabel=Diperlukan sedikitnya [mb] MB ruang bebas. +CannotInstallToNetworkDrive=Kami tidak bisa memasang ke diska jaringan. +CannotInstallToUNCPath=Kami tidak bisa memasang ke alamat UNC. +InvalidPath=Anda wajib memasukkan alamat lengkap dengan huruf diska; contohnya:%n%nC:\APP%n%natau alamat UNC dalam bentuk:%n%n\\server\share +InvalidDrive=Diska atau alamat UNC yang Anda pilih tidak ada atau tidak dapat diakses. Silakan pilih yang lain. +DiskSpaceWarningTitle=Ruang Bebas Tidak Cukup +DiskSpaceWarning=Kami memerlukan sedikitnya %1 KB ruang bebas untuk memasang, namun diska yang Anda pilih hanya memiliki %2 KB tersedia.%n%nMaju terus? +DirNameTooLong=Nama map atau alamat terlalu panjang. +InvalidDirName=Nama map tidak sah. +BadDirName32=Nama map dilarang berisi karakter-karakter berikut:%n%n%1 DirExistsTitle=Map Sudah Ada DirExists=Map:%n%n%1%n%nsudah ada. Tetap pasang di map tersebut? -DirDoesntExistTitle=Map Belum Ada -DirDoesntExist=Map:%n%n%1%n%nbelum ada. Buat map tersebut? +DirDoesntExistTitle=Map Tidak Ada +DirDoesntExist=Map:%n%n%1%n%ntidak ada. Buat map? -; *** Halaman "Pilih Komponen" WizardSelectComponents=Pilih Komponen SelectComponentsDesc=Komponen mana sajakah yang sebaiknya dipasang? -SelectComponentsLabel2=Pilih komponen-komponen yang Anda ingin pasang; hapus centang pada komponen yang Anda tidak ingin pasang. Klik Berikutnya bila Anda siap melanjutkan. -FullInstallation=Pasang secara penuh -; kalau bisa, jangan terjemahkan "Padat" (Compact) menjadi "Minimal". Maksudnya, "Minimal" dalam bahasa Anda -CompactInstallation=Pemasangan Padat -CustomInstallation=Suka-suka saya -NoUninstallWarningTitle=Komponen Sudah Ada -NoUninstallWarning=Kami mendeteksi bahwa komponen-komponen berikut sudah terpasang pada komputer Anda:%n%n%1%n%nKomponen-komponen tersebut tidak akan dihapus walau Anda batal memilihnya.%n%nTetap lanjutkan? +SelectComponentsLabel2=Centang komponen yang Anda inginkan; batalkan centang dari komponen yang tidak Anda inginkan. Klik Maju saat Anda siap meneruskan. +FullInstallation=Instalasi penuh +CompactInstallation=Instalasi padat +CustomInstallation=Instalasi kustom +NoUninstallWarningTitle=Komponen Terpasang +NoUninstallWarning=Kami mendeteksi bahwa komponen berikut telah terpasang pada komputer Anda:%n%n%1%n%nMembatalkan pilihan atas komponen berikut bukan berarti melepasnya.%n%nMaju terus? ComponentSize1=%1 KB ComponentSize2=%1 MB -ComponentsDiskSpaceGBLabel=Pilihan Anda saat ini memerlukan sedikitnya [gb] GB ruang kosong. -ComponentsDiskSpaceMBLabel=Pilihan Anda saat ini memerlukan sedikitnya [mb] MB ruang kosong. +;Inno6 +ComponentsDiskSpaceGBLabel=Pilihan saat ini memerlukan sedikitnya [gb] GB ruang bebas. +;Inno6 +ComponentsDiskSpaceMBLabel=Pilihan saat ini memerlukan sedikitnya [mb] MB ruang bebas. -; *** Halaman "Pilih Tugas Tambahan" WizardSelectTasks=Pilih Tugas Tambahan -SelectTasksDesc=Tugas tambahan mana sajakah yang Anda ingin jalankan? -SelectTasksLabel2=Pilih tugas tambahan yang Anda ingin agar kami jalankan saat memasang [name], lalu klik Berikutnya. +SelectTasksDesc=Tugas tambahan mana sajakah yang sebaiknya dijalankan? +SelectTasksLabel2=Pilih tugas tambahan yang Anda ingin kami jalankan ketika memasang [name], lalu klik Maju. -; *** Halaman "Pilih Map Menu Start" WizardSelectProgramGroup=Pilih Map Menu Start -SelectStartMenuFolderDesc=Di manakah sebaiknya kami menempatkan pintasan program? -SelectStartMenuFolderLabel3=Kami akan membuat pintasan program di dalam map Menu Start berikut. -SelectStartMenuFolderBrowseLabel=Klik Berikutnya untuk melanjutkan. Bila Anda ingin memilih map lain, klik Jelajahi. +SelectStartMenuFolderDesc=Di manakah sebaiknya kami letakkan pintasan program? +SelectStartMenuFolderLabel3=Kami akan membuat pintasan program di map Menu Start berikut. +SelectStartMenuFolderBrowseLabel=Untuk meneruskan, klik Maju. Bila Anda ingin memilih map lain, klik Cari. MustEnterGroupName=Anda wajib memasukkan nama map. -GroupNameTooLong=Alamat atau nama map terlalu panjang. +GroupNameTooLong=Nama map atau alamat terlalu panjang. InvalidGroupName=Nama map tidak sah. -BadGroupName=Nama map dilarang berisi karakter berikut:%n%n%1 +BadGroupName=Nama map dilarang berisi karakter-karakter berikut:%n%n%1 NoProgramGroupCheck2=&Jangan buat map Menu Start -; *** Halaman "Siap Memasang" WizardReady=Siap Memasang -ReadyLabel1=Kami telah siap untuk mulai memasang [name] pada komputer Anda. -ReadyLabel2a=Klik Pasang untuk melanjutkan dengan pengaturan yang Anda pilih, atau klik Sebelumnya bila Anda ingin melihat ulang atau mengubah pengaturan. -ReadyLabel2b=Klik Pasang untuk melanjutkan dengan pengaturan yang Anda pilih +ReadyLabel1=Kami siap untuk memulai instalasi [name] pada komputer Anda. +ReadyLabel2a=Klik Pasang untuk meneruskan instalasi, atau klik Kembali bila Anda ingin menilik atau mengubah setelan. +ReadyLabel2b=Klik Pasang untuk meneruskan instalasi. ReadyMemoUserInfo=Informasi pengguna: -ReadyMemoDir=Lokasi pemasangan: -ReadyMemoType=Jenis pemasangan: +ReadyMemoDir=Lokasi tujuan: +ReadyMemoType=Tipe instalasi: ReadyMemoComponents=Komponen terpilih: ReadyMemoGroup=Map Menu Start: ReadyMemoTasks=Tugas Tambahan: -; *** Halaman "Bersiap Memasang" +;Inno6 +DownloadingLabel=Mengunduh berkas tambahan... +ButtonStopDownload=&Setop Unduhan +StopDownload=Anda yakin ingin berhenti mengunduh? +ErrorDownloadAborted=Unduhan dibatalkan +ErrorDownloadFailed=Gagal mengunduh: %1 %2 +ErrorDownloadSizeFailed=Gagal mendapatkan ukuran: %1 %2 +ErrorFileHash1=Ceksum berkas gagal: %1 +ErrorFileHash2=Ceksum berkas tidak sah: seharusnya %1, yang kami dapatkan %2 +ErrorProgress=Langkah tidak sah: %1 dari %2 +ErrorFileSize=Ukuran berkas tidak sah: seharusnya %1, yang kami dapatkan %2 +;Inno6 + WizardPreparing=Bersiap Memasang PreparingDesc=Kami sedang bersiap memasang [name] pada komputer Anda. -PreviousInstallNotCompleted=Pemasangan/pelepasan dari program sebelumnya tidaklah lengkap. Anda perlu memulai ulang komputer untuk melengkapi pemasangan tersebut.%n%nSeusai memulai ulang komputer, jalankan Pemasang ini lagi untuk melengkapi pemasangan [name]. -CannotContinue=Kami tidak dapat melanjutkan. Silakan klik Batal untuk keluar. -ApplicationsFound=Aplikasi-aplikasi berikut sedang memakai berkas-berkas yang perlu diperbarui oleh kami. Disarankan agar Anda mengizinkan kami untuk menutup aplikasi-aplikasi tersebut secara otomatis. -ApplicationsFound2=Aplikasi-aplikasi berikut sedang memakai berkas-berkas yang perlu diperbaru oleh kami. Disarankan agar Anda mengizinkan kami untuk menutup aplikasi-aplikasi tersebut secara otomatis. Seusai memasang, kami akan berusaha menjalankan ulang aplikasi-aplikasi tersebut. -CloseApplications=&Otomatis tutup aplikasi-aplikasi tersebut -DontCloseApplications=&Jangan tutup aplikasi-aplikasi tersebut -ErrorCloseApplications=Kami tidak dapat menutup semua aplikasi tersebut secara otomatis. Disarankan agar Anda menutup semua aplikasi yang memakai berkas-berkas yang perlu kami perbarui sebelum melanjutkan. -PrepareToInstallNeedsRestart=Kami harus memulai ulang komputer Anda. Seusai memulai ulang, jalankan kembali Pemasang ini untuk melengkapi pemasangan [name].%n%nMulai ulang sekarang? +PreviousInstallNotCompleted=Instalasi/pelepasan dari program sebelumnya tidak lengkap. Anda perlu memulai ulang komputer untuk melengkapinya nanti.%n%nSetelah itu, jalankan Pemandu kembali untuk melengkapi instalasi [name]. +CannotContinue=Kami tidak bisa meneruskan. Klik Batal untuk keluar. +ApplicationsFound=Aplikasi berikut tengah memakai berkas-berkas yang perlu kami perbarui. Disarankan agar Anda mengizinkan kami untuk menutupnya secara otomatis. +ApplicationsFound2=Aplikasi berikut tengah memakai berkas-berkas yang perlu kami perbarui. Disarankan agar Anda mengizinkan kami untuk menutupnya secara otomatis. Selengkapnya memasang, kami akan berusaha memulai ulang aplikasi-aplikasi tersebut. +CloseApplications=&Otomatis tutup aplikasi +DontCloseApplications=&Jangan tutup aplikasi +ErrorCloseApplications=Kami tidak dapat menutup semua aplikasi secara otomatis. Disarankan agar Anda menutup semua aplikasi yang memakai berkas-berkas yang perlu kami perbarui sebelum meneruskan. +;Inno6 +PrepareToInstallNeedsRestart=Kami perlu memulai ulang komputer Anda. Setelah itu, jalankan Pemandu kembali untuk melengkapi pemasangan [name].%n%nMulai ulang sekarang? +;Inno6 -; *** Halaman "Memasang" WizardInstalling=Memasang -InstallingLabel=Silakan tunggu sementara kami memasang [name] pada komputer Anda. +InstallingLabel=Silakan tunggu selagi kami memasang [name] pada komputer Anda. -; *** Halaman "Pemasangan Lengkap" -FinishedHeadingLabel=Menyelesaikan Asisten Pemasangan [name] +FinishedHeadingLabel=Mengakhiri Instalasi [name] FinishedLabelNoIcons=Kami telah selesai memasang [name] pada komputer Anda. -FinishedLabel=Kami telah selesai memasang [name] pada komputer Anda. Program tersebut dapat dijalankan dengan memilih pintasan yang terpasang. -ClickFinish=Klik Selesai untuk mengakhiri pemasangan. -FinishedRestartLabel=Agar pemasangan [name] lengkap, kami harus memulai ulang komputer Anda. Mulai ulang sekarang? -FinishedRestartMessage=Agar pemasangan [name] lengkap, kami harus memulai ulang komputer Anda.%n%nMulai ulang sekarang? -ShowReadmeCheck=Ya, saya mau membaca berkas README -YesRadio=&Ya, mulai ulang sekarang -NoRadio=&Tidak, saya akan memulai ulang nanti -; contoh: 'Jalankan MyProg.exe' +FinishedLabel=Kami telah selesai memasang [name] pada komputer Anda. Aplikasi tersebut bisa dijalankan dengan cara memilih pintasan yang terpasang. +ClickFinish=Klik Selesai untuk menutup instalasi. +FinishedRestartLabel=Demi melengkapi instalasi [name], kami perlu memulai ulang komputer Anda. Lakukan sekarang? +FinishedRestartMessage=Demi melengkapi instalasi [name], kami perlu memulai ulang komputer Anda.%n%nLakukan sekarang? +ShowReadmeCheck=Ya, saya ingin melihat berkas README +YesRadio=&Ya, mulai ulang komputer sekarang +NoRadio=&Tidak, saya akan memulai ulang komputer nanti RunEntryExec=Jalankan %1 -; contoh: 'Lihat Readme.txt' RunEntryShellExec=Lihat %1 -; *** Pesan yang berkaitan dengan "Setup Needs the Next Disk" -ChangeDiskTitle=Kami Memerlukan Kandar Lanjutan -SelectDiskLabel2=Silakan masukkan Kandar %1 dan klik OK.%n%nBila berkas-berkas pada kandar ini dapat ditemukan selain pada map berikut, masukkan alamat yang tepat atau klik Jelajahi. +ChangeDiskTitle=Kami Memerlukan Diska Sambungan +SelectDiskLabel2=Silakan masukkan Diska %1 dan klik OK.%n%nBila berkas-berkas di dalam diska ini dapat ditemukan di map lain selain yang ditampilkan di bawah, masukkan alamat yang benar atau klik Cari. PathLabel=&Alamat: -FileNotInDir2=Berkas "%1" tidak dapat ditemukan di dalam "%2". Silakan masukkan kandar yang tepat atau pilih map lain. -SelectDirectoryLabel=Silakan tunjukkan lokasi kandar lanjutan. +FileNotInDir2=Berkas "%1" tidak dapat ditemukan di "%2". Silakan masukkan diska yang benar atau pilih map lain. +SelectDirectoryLabel=Silakan tentukan lokasi diska berikutnya. -; *** Pesan untuk fase pemasangan -SetupAborted=Pemasangan tidak lengkap.%n%nSilakan selesaikan masalah dan jalankan Pemasang ini kembali. +SetupAborted=Instalasi tidak lengkap.%n%nSilakan koreksi masalah dan jalankan Pemandu kembali. +;Inno6 AbortRetryIgnoreSelectAction=Pilih tindakan AbortRetryIgnoreRetry=&Coba lagi -AbortRetryIgnoreIgnore=&Abaikan masalah dan lanjutkan +AbortRetryIgnoreIgnore=&Abaikan galat dan teruskan AbortRetryIgnoreCancel=Batalkan pemasangan +;Inno6 -; *** Pesan untuk status pemasangan -StatusClosingApplications=Menutup aplikasi .... -StatusCreateDirs=Membuat direktori .... -StatusExtractFiles=Mengekstrak berkas .... -StatusCreateIcons=Membuat pintasan .... -StatusCreateIniEntries=Membuat isi berkas INI ... -StatusCreateRegistryEntries=Membuat daftar registri .... -StatusRegisterFiles=Mendaftarkan berkas .... -StatusSavingUninstall=Menyimpan informasi pelepasan .... -StatusRunProgram=Mengakhiri pemasangan .... -StatusRestartingApplications=Memulai ulang aplikasi .... -StatusRollback=Membatalkan perubahan .... +StatusClosingApplications=Menutup aplikasi... +StatusCreateDirs=Membuat direktori... +StatusExtractFiles=Mengekstrak berkas... +StatusCreateIcons=Membuat pintasan... +StatusCreateIniEntries=Membuat catatan INI... +StatusCreateRegistryEntries=Membuat catatan Registry... +StatusRegisterFiles=Meregistrasi berkas... +StatusSavingUninstall=Menyimpan informasi pelepas... +StatusRunProgram=Mengakhiri instalasi... +StatusRestartingApplications=Menjalankan ulang aplikasi... +StatusRollback=Membatalkan perubahan... -; *** Masalah secara umum -ErrorInternal2=Masalah internal: %1 +ErrorInternal2=Galat internal: %1 ErrorFunctionFailedNoCode=%1 gagal ErrorFunctionFailed=%1 gagal; kode %2 ErrorFunctionFailedWithMessage=%1 gagal; kode %2.%n%3 ErrorExecutingProgram=Tidak dapat mengeksekusi berkas:%n%1 -; *** Masalah pada Registry -ErrorRegOpenKey=Masalah saat membuka kunci registri:%n%1\%2 -ErrorRegCreateKey=Masalah saat membuat kunci registri:%n%1\%2 -ErrorRegWriteKey=Masalah saat menulis pada kunci registri:%n%1\%2 +ErrorRegOpenKey=Galat membuka kunci Registry:%n%1\%2 +ErrorRegCreateKey=Galat membuat kunci Registry:%n%1\%2 +ErrorRegWriteKey=Galat menulis kunci Registry:%n%1\%2 -; *** Masalah pada INI -ErrorIniEntry=Terjadi masalah saat membuat entri INI dalam berkas "%1". +ErrorIniEntry=Galat membuat catatan INI dalam berkas "%1". -; *** Masalah saat menyalin berkas +;Inno6 FileAbortRetryIgnoreSkipNotRecommended=&Lewati berkas ini (tidak disarankan) -FileAbortRetryIgnoreIgnoreNotRecommended=&Abaikan masalah dan lanjutkan (tidak disarankan) -SourceIsCorrupted=Berkas sumber telah rusak -SourceDoesntExist=Berkas sumber "%1" tidak ada -ExistingFileReadOnly2=Berkas yang telah ada tidak bisa diganti karena ditandai hanya-baca. +FileAbortRetryIgnoreIgnoreNotRecommended=&Abaikan galat dan teruskan (tidak disarankan) +;Inno6 + +SourceIsCorrupted=Berkas asal telah rusak +SourceDoesntExist=Berkas asal "%1" tidak ada + +;Inno6 +ExistingFileReadOnly2=Berkas yang sudah ada tidak bisa ditimpa karena telah ditandai hanya-baca. ExistingFileReadOnlyRetry=&Hapus atribut hanya-baca dan coba lagi ExistingFileReadOnlyKeepExisting=&Pertahankan berkas yang sudah ada -ErrorReadingExistingDest=Terjadi masalah saat mencoba membaca berkas yang sudah ada: -FileExists=Berkas sudah ada.%n%nTimpa berkas tersebut? -ExistingFileNewer=Berkas yang sudah ada lebih baru dibanding dengan yang akan kami pasang. Disarankan agar Anda mempertahankan berkas tersebut.%n%nPertahankan berkas tersebut? -ErrorChangingAttr=Terjadi masalah saat mencoba mengubah atribut berkas yang sudah ada: -ErrorCreatingTemp=Terjadi masalah saat mencoba membuat berkas di dalam direktori pemasangan: -ErrorReadingSource=Terjadi masalah saat mencoba membaca berkas sumber: -ErrorCopying=Terjadi masalah saat mencoba menyalin berkas: -ErrorReplacingExistingFile=Terjadi masalah saat mencoba menimpa berkas yang sudah ada: -ErrorRestartReplace=Fungsi RestartReplace gagal: -ErrorRenamingTemp=Terjadi masalah saat mencoba mengubah nama berkas dalam direktori pemasangan: -ErrorRegisterServer=Tidak dapat mendaftarkan berkas DLL/OCX: %1 +ErrorReadingExistingDest=Terjadi galat saat berusaha membaca berkas yang sudah ada: +FileExistsSelectAction=Pilih tindakan +FileExists2=Berkas sudah ada. +FileExistsOverwriteExisting=&Timpa berkas yang sudah ada +FileExistsKeepExisting=&Pertahankan berkas yang sudah ada +FileExistsOverwriteOrKeepAll=&Lakukan ini untuk konflik (bentrok) berikutnya +ExistingFileNewerSelectAction=Pilih tindakan +ExistingFileNewer2=Berkas yang sudah ada lebih baru dari yang akan kami coba pasang. +ExistingFileNewerOverwriteExisting=&Timpa berkas yang sudah ada +ExistingFileNewerKeepExisting=&Pertahankan berkas yang sudah ada (disarankan) +ExistingFileNewerOverwriteOrKeepAll=&Lakukan ini untuk konflik (bentrok) berikutnya +;Inno6 +ErrorReadingExistingDest=Terjadi galat saat berusaha membaca berkas yang sudah ada: +ErrorChangingAttr=Terjadi galat saat berusaha mengubah atribusi berkas yang sudah ada: +ErrorCreatingTemp=Terjadi galat saat berusaha membuat berkas di direktori tujuan: +ErrorReadingSource=Terjadi galat saat berusaha membaca berkas asal: +ErrorCopying=Terjadi galat saat berusaha menyalin berkas: +ErrorReplacingExistingFile=Terjadi galat saat berusaha menimpa berkas yang sudah ada: +ErrorRestartReplace=RestartReplace gagal: +ErrorRenamingTemp=Terjadi galat saat berusaha mengubah nama berkas di direktori tujuan: +ErrorRegisterServer=Tidak dapat meregistrasi DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 gagal dengan kode akhir %1 -ErrorRegisterTypeLib=Tidak dapat mendaftarkan pustaka: %1 +ErrorRegisterTypeLib=Tidak dapat meregistrasi berkas referensi: %1 -; *** Penandaan tampilan nama saat melepas -; contoh 'Program saya (32-bita)' +;Inno6 UninstallDisplayNameMark=%1 (%2) -; contoh 'Program saya (32-bita, Semua pengguna)' UninstallDisplayNameMarks=%1 (%2, %3) UninstallDisplayNameMark32Bit=32-bita UninstallDisplayNameMark64Bit=64-bita UninstallDisplayNameMarkAllUsers=Semua pengguna UninstallDisplayNameMarkCurrentUser=Pengguna saat ini +;Inno6 -; *** Masalah pasca-pemasangan -ErrorOpeningReadme=Terjadi masalah saat mencoba membuka berkas README. -ErrorRestartingComputer=Kami tidak dapat memulai ulang komputer. Silakan lakukan secara manual. +ErrorOpeningReadme=Terjadi galat saat berusaha membuka berkas README. +ErrorRestartingComputer=Kami gagal memulai ulang komputer. Silakan lakukan secara manual. -; *** Pesan untuk Pelepas -UninstallNotFound=Berkas "%1" tidak ada. Tidak bisa melepas. -UninstallOpenError=Berkas "%1" tidak bisa dibuka. Tidak bisa melepas -UninstallUnsupportedVer=Berkas catatan pelepas "%1" tertulis dalam format yang tak dikenali oleh pelepas versi ini. Tidak bisa melepas. +UninstallNotFound=Berkas "%1" tidak ada. Tidak bisa melepas +UninstallOpenError=Berkas "%1" tidak dapat dibuka. Tidak bisa melepas +UninstallUnsupportedVer=Berkas catatan pelepas "%1" tidak dalam format yang kami kenali. Tidak bisa melepas UninstallUnknownEntry=Entri tak dikenal (%1) ditemukan dalam catatan pelepas -ConfirmUninstall=Apakah Anda yakin hendak menghapus %1 beserta semua komponennya? -UninstallOnlyOnWin64=Instalasi ini hanya dapat dilepas pada Windows 64-bita. -OnlyAdminCanUninstall=Instalasi ini hanya dapat dilepas oleh pengguna dengan izin administratif. -UninstallStatusLabel=Silakan tunggu sementara %1 dihapus dari komputer Anda. -UninstalledAll=%1 berhasil dilepas dari komputer Anda. -UninstalledMost=Selesai melepas %1.%n%nBeberapa elemen tidak dapat dihapus. Anda dapat menghapusnya secara manual. -UninstalledAndNeedsRestart=Untuk melengkapi pelepasan %1, komputer Anda harus dimulai ulang.%n%nMulai ulang sekarang? -UninstallDataCorrupted=Berkas "%1" telah rusak. Tidak bisa melepas +ConfirmUninstall=Anda yakin ingin melepas %1 beserta semua komponennya? +UninstallOnlyOnWin64=Instalasi ini hanya bisa dilepas pada Windows 64-bita. +OnlyAdminCanUninstall=Instalasi ini hanya bisa dilepas oleh pengguna dengan izin administratif. +UninstallStatusLabel=Silakan tunggu selagi %1 dihapus dari komputer Anda. +UninstalledAll=%1 berhasil dihapus dari komputer Anda. +UninstalledMost=Selesai melepas %1.%n%nBeberapa elemen tidak dapat dihapus. Anda bisa menghapusnya secara manual. +UninstalledAndNeedsRestart=Untuk melengkapi pelepasan %1, komputer Anda perlu dimulai ulang.%n%nMulai ulang sekarang? +UninstallDataCorrupted=Berkas "%1" rusak. Tidak bisa melepas -; *** Pesan untuk fase pelepasan ConfirmDeleteSharedFileTitle=Hapus Berkas Bersama? -ConfirmDeleteSharedFile2=Sistem mengindikasi bahwa berkas-berkas bersama berikut tidak lagi dipakai oleh program apa pun. Apakah Anda ingin kami menghapus berkas-berkas tersebut?%n%nJika berkas-berkas tersebut dihapus dan masih ada program yang memakainya, program tersebut mungkin akan berjalan di luar semestinya. Bila Anda tidak yakin, pilih Tidak. Membiarkan berkas tersebut pada komputer Anda tidak akan menimbulkan masalah. +ConfirmDeleteSharedFile2=Sistem mengindikasi bahwa berkas bersama di bawah ini tidak lagi dipakai oleh program mana pun. Apa Anda ingin agar kami menghapusnya?%n%nBila masih ada program yang memakainya dan berkas ini dihapus, program tersebut dapat tidak berfungsi dengan semestinya. Bila Anda ragu, pilih No. Membiarkan berkas ini pada sistem Anda takkan membahayakan. SharedFileNameLabel=Nama berkas: SharedFileLocationLabel=Lokasi: WizardUninstalling=Status Pelepasan StatusUninstalling=Melepas %1... -; *** Blok alasan Shutdown ShutdownBlockReasonInstallingApp=Memasang %1. ShutdownBlockReasonUninstallingApp=Melepas %1. -; Pesan khusus berikut tidak digunakan oleh Pemasang itu sendiri, -; namun bila Anda memakainya di dalam skrip Anda, maka terjemahkan. - [CustomMessages] NameAndVersion=%1 versi %2 AdditionalIcons=Pintasan tambahan: -CreateDesktopIcon=Buat pintasan di &Desktop -CreateQuickLaunchIcon=Buat pintasan di &Quick Launch -ProgramOnTheWeb=%1 di web +CreateDesktopIcon=Buat pintasan &desktop +CreateQuickLaunchIcon=Buat pintasan Pelontar &Cepat +ProgramOnTheWeb=%1 di Web UninstallProgram=Lepas %1 LaunchProgram=Jalankan %1 -AssocFileExtension=&Asosiasikan %1 dengan ekstensi berkas %2 -AssocingFileExtension=Mengasosiasikan %1 dengan ekstensi berkas %2 .... +AssocFileExtension=&Kaitkan %1 dengan ekstensi berkas %2 +AssocingFileExtension=Mengaitkan %1 dengan ekstensi berkas %2... AutoStartProgramGroupDescription=Startup: -AutoStartProgram=Jalankan %1 secara otomatis -AddonHostProgramNotFound=%1 tidak dapat ditemukan di dalam map yang Anda pilih.%n%nTetap lanjutkan? +AutoStartProgram=Otomatis jalankan %1 +AddonHostProgramNotFound=%1 tidak dapat ditemukan di map yang Anda pilih.%n%nMaju terus? diff --git a/installer/innosetup/Languages/Italian.isl b/installer/innosetup/Languages/Italian.isl new file mode 100644 index 000000000..cfdf8b5ca --- /dev/null +++ b/installer/innosetup/Languages/Italian.isl @@ -0,0 +1,390 @@ +; bovirus@gmail.com +; *** Inno Setup version 6.1.0+ Italian messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Italian.isl - Last Update: 25.07.2020 by bovirus (bovirus@gmail.com) +; +; Translator name: bovirus +; Translator e-mail: bovirus@gmail.com +; Based on previous translations of Rinaldo M. aka Whiteshark (based on ale5000 5.1.11+ translation) +; +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Italiano +LanguageID=$0410 +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Installazione +SetupWindowTitle=Installazione di %1 +UninstallAppTitle=Disinstallazione +UninstallAppFullTitle=Disinstallazione di %1 + +; *** Misc. common +InformationTitle=Informazioni +ConfirmTitle=Conferma +ErrorTitle=Errore + +; *** SetupLdr messages +SetupLdrStartupMessage=Questa è l'installazione di %1.%n%nVuoi continuare? +LdrCannotCreateTemp=Impossibile creare un file temporaneo.%n%nInstallazione annullata. +LdrCannotExecTemp=Impossibile eseguire un file nella cartella temporanea.%n%nInstallazione annullata. + +; *** Startup error messages +LastErrorMessage=%1.%n%nErrore %2: %3 +SetupFileMissing=File %1 non trovato nella cartella di installazione.%n%nCorreggi il problema o richiedi una nuova copia del programma. +SetupFileCorrupt=I file di installazione sono danneggiati.%n%nRichiedi una nuova copia del programma. +SetupFileCorruptOrWrongVer=I file di installazione sono danneggiati, o sono incompatibili con questa versione del programma di installazione.%n%nCorreggi il problema o richiedi una nuova copia del programma. +InvalidParameter=È stato inserito nella riga di comando un parametro non valido:%n%n%1 +SetupAlreadyRunning=Il processo di installazione è già in funzione. +WindowsVersionNotSupported=Questo programma non supporta la versione di Windows installata nel computer. +WindowsServicePackRequired=Questo programma richiede %1 Service Pack %2 o successivo. +NotOnThisPlatform=Questo programma non è compatibile con %1. +OnlyOnThisPlatform=Questo programma richiede %1. +OnlyOnTheseArchitectures=Questo programma può essere installato solo su versioni di Windows progettate per le seguenti architetture della CPU:%n%n%1 +WinVersionTooLowError=Questo programma richiede %1 versione %2 o successiva. +WinVersionTooHighError=Questo programma non può essere installato su %1 versione %2 o successiva. +AdminPrivilegesRequired=Per installare questo programma sono richiesti privilegi di amministratore. +PowerUserPrivilegesRequired=Per poter installare questo programma sono richiesti i privilegi di amministratore o di Power Users. +SetupAppRunningError=%1 è attualmente in esecuzione.%n%nChiudi adesso tutte le istanze del programma e poi seleziona "OK", o seleziona "Annulla" per uscire. +UninstallAppRunningError=%1 è attualmente in esecuzione.%n%nChiudi adesso tutte le istanze del programma e poi seleziona "OK", o seleziona "Annulla" per uscire. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Seleziona modo installazione +PrivilegesRequiredOverrideInstruction=Seleziona modo installazione +PrivilegesRequiredOverrideText1=%1 può essere installato per tutti gli utenti (richiede privilegi di amministratore), o solo per l'utente attuale. +PrivilegesRequiredOverrideText2=%1 può essere installato solo per l'utente attuale, o per tutti gli utenti (richiede privilegi di amministratore). +PrivilegesRequiredOverrideAllUsers=Inst&alla per tutti gli utenti +PrivilegesRequiredOverrideAllUsersRecommended=Inst&alla per tutti gli utenti (suggerito) +PrivilegesRequiredOverrideCurrentUser=Installa solo per l'&utente attuale +PrivilegesRequiredOverrideCurrentUserRecommended=Installa solo per l'&utente attuale (suggerito) + +; *** Misc. errors +ErrorCreatingDir=Impossibile creare la cartella "%1" +ErrorTooManyFilesInDir=Impossibile creare i file nella cartella "%1" perché contiene troppi file. + +; *** Setup common messages +ExitSetupTitle=Uscita dall'installazione +ExitSetupMessage=L'installazione non è completa.%n%nUscendo dall'installazione in questo momento, il programma non sarà installato.%n%nÈ possibile eseguire l'installazione in un secondo tempo.%n%nVuoi uscire dall'installazione? +AboutSetupMenuItem=&Informazioni sull'installazione... +AboutSetupTitle=Informazioni sull'installazione +AboutSetupMessage=%1 versione %2%n%3%n%n%1 sito web:%n%4 +AboutSetupNote= +TranslatorNote=Traduzione italiana a cura di Rinaldo M. aka Whiteshark e bovirus (v. 11.09.2018) + +; *** Buttons +ButtonBack=< &Indietro +ButtonNext=&Avanti > +ButtonInstall=Inst&alla +ButtonOK=OK +ButtonCancel=Annulla +ButtonYes=&Si +ButtonYesToAll=Sì a &tutto +ButtonNo=&No +ButtonNoToAll=N&o a tutto +ButtonFinish=&Fine +ButtonBrowse=&Sfoglia... +ButtonWizardBrowse=S&foglia... +ButtonNewFolder=&Crea nuova cartella + +; *** "Select Language" dialog messages +SelectLanguageTitle=Seleziona la lingua dell'installazione +SelectLanguageLabel=Seleziona la lingua da usare durante l'installazione. + +; *** Common wizard text +ClickNext=Seleziona "Avanti" per continuare, o "Annulla" per uscire. +BeveledLabel= +BrowseDialogTitle=Sfoglia cartelle +BrowseDialogLabel=Seleziona una cartella nell'elenco, e quindi seleziona "OK". +NewFolderName=Nuova cartella + +; *** "Welcome" wizard page +WelcomeLabel1=Installazione di [name] +WelcomeLabel2=[name/ver] sarà installato sul computer.%n%nPrima di procedere chiudi tutte le applicazioni attive. + +; *** "Password" wizard page +WizardPassword=Password +PasswordLabel1=Questa installazione è protetta da password. +PasswordLabel3=Inserisci la password, quindi per continuare seleziona "Avanti".%nLe password sono sensibili alle maiuscole/minuscole. +PasswordEditLabel=&Password: +IncorrectPassword=La password inserita non è corretta. Riprova. + +; *** "License Agreement" wizard page +WizardLicense=Contratto di licenza +LicenseLabel=Prima di procedere leggi con attenzione le informazioni che seguono. +LicenseLabel3=Leggi il seguente contratto di licenza.%nPer procedere con l'installazione è necessario accettare tutti i termini del contratto. +LicenseAccepted=Accetto i termini del &contratto di licenza +LicenseNotAccepted=&Non accetto i termini del contratto di licenza + +; *** "Information" wizard pages +WizardInfoBefore=Informazioni +InfoBeforeLabel=Prima di procedere leggi le importanti informazioni che seguono. +InfoBeforeClickLabel=Quando sei pronto per proseguire, seleziona "Avanti". +WizardInfoAfter=Informazioni +InfoAfterLabel=Prima di procedere leggi le importanti informazioni che seguono. +InfoAfterClickLabel=Quando sei pronto per proseguire, seleziona "Avanti". + +; *** "User Information" wizard page +WizardUserInfo=Informazioni utente +UserInfoDesc=Inserisci le seguenti informazioni. +UserInfoName=&Nome: +UserInfoOrg=&Società: +UserInfoSerial=&Numero di serie: +UserInfoNameRequired=È necessario inserire un nome. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Selezione cartella di installazione +SelectDirDesc=Dove vuoi installare [name]? +SelectDirLabel3=[name] sarà installato nella seguente cartella. +SelectDirBrowseLabel=Per continuare seleziona "Avanti".%nPer scegliere un'altra cartella seleziona "Sfoglia". +DiskSpaceGBLabel=Sono richiesti almeno [gb] GB di spazio libero nel disco. +DiskSpaceMBLabel=Sono richiesti almeno [mb] MB di spazio libero nel disco. +CannotInstallToNetworkDrive=Non è possibile effettuare l'installazione in un disco in rete. +CannotInstallToUNCPath=Non è possibile effettuare l'installazione in un percorso UNC. +InvalidPath=Va inserito un percorso completo di lettera di unità; per esempio:%n%nC:\APP%n%no un percorso di rete nella forma:%n%n\\server\condivisione +InvalidDrive=L'unità o il percorso di rete selezionato non esiste o non è accessibile.%n%nSelezionane un altro. +DiskSpaceWarningTitle=Spazio su disco insufficiente +DiskSpaceWarning=L'installazione richiede per eseguire l'installazione almeno %1 KB di spazio libero, ma l'unità selezionata ha solo %2 KB disponibili.%n%nVuoi continuare comunque? +DirNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. +InvalidDirName=Il nome della cartella non è valido. +BadDirName32=Il nome della cartella non può includere nessuno dei seguenti caratteri:%n%n%1 +DirExistsTitle=Cartella già esistente +DirExists=La cartella%n%n %1%n%nesiste già.%n%nVuoi comunque installare l'applicazione in questa cartella? +DirDoesntExistTitle=Cartella inesistente +DirDoesntExist=La cartella%n%n %1%n%nnon esiste. Vuoi creare la cartella? + +; *** "Select Components" wizard page +WizardSelectComponents=Selezione componenti +SelectComponentsDesc=Quali componenti vuoi installare? +SelectComponentsLabel2=Seleziona i componenti da installare, deseleziona quelli che non vuoi installare.%nPer continuare seleziona "Avanti". +FullInstallation=Installazione completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Installazione compatta +CustomInstallation=Installazione personalizzata +NoUninstallWarningTitle=Componente esistente +NoUninstallWarning=I seguenti componenti sono già installati nel computer:%n%n%1%n%nDeselezionando questi componenti essi non verranno rimossi.%n%nVuoi continuare comunque? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=La selezione attuale richiede almeno [gb] GB di spazio nel disco. +ComponentsDiskSpaceMBLabel=La selezione attuale richiede almeno [mb] MB di spazio nel disco. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Selezione processi aggiuntivi +SelectTasksDesc=Quali processi aggiuntivi vuoi eseguire? +SelectTasksLabel2=Seleziona i processi aggiuntivi che verranno eseguiti durante l'installazione di [name], quindi seleziona "Avanti". + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Selezione della cartella nel menu Avvio/Start +SelectStartMenuFolderDesc=Dove vuoi inserire i collegamenti al programma? +SelectStartMenuFolderLabel3=Verranno creati i collegamenti al programma nella seguente cartella del menu Avvio/Start. +SelectStartMenuFolderBrowseLabel=Per continuare, seleziona "Avanti".%nPer selezionare un'altra cartella, seleziona "Sfoglia". +MustEnterGroupName=Devi inserire il nome della cartella. +GroupNameTooLong=Il nome della cartella o il percorso sono troppo lunghi. +InvalidGroupName=Il nome della cartella non è valido. +BadGroupName=Il nome della cartella non può includere nessuno dei seguenti caratteri:%n%n%1 +NoProgramGroupCheck2=&Non creare una cartella nel menu Avvio/Start + +; *** "Ready to Install" wizard page +WizardReady=Pronto per l'installazione +ReadyLabel1=Il programma è pronto per iniziare l'installazione di [name] nel computer. +ReadyLabel2a=Seleziona "Installa" per continuare con l'installazione, o "Indietro" per rivedere o modificare le impostazioni. +ReadyLabel2b=Per procedere con l'installazione seleziona "Installa". +ReadyMemoUserInfo=Informazioni utente: +ReadyMemoDir=Cartella di installazione: +ReadyMemoType=Tipo di installazione: +ReadyMemoComponents=Componenti selezionati: +ReadyMemoGroup=Cartella del menu Avvio/Start: +ReadyMemoTasks=Processi aggiuntivi: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Download file aggiuntivi... +ButtonStopDownload=&Stop download +StopDownload=Sei sicuro di voler interrompere il download? +ErrorDownloadAborted=Download annullato +ErrorDownloadFailed=Download fallito: %1 %2 +ErrorDownloadSizeFailed=Rilevamento dimensione fallito: %1 %2 +ErrorFileHash1=Errore hash file: %1 +ErrorFileHash2=Hash file non valido: atteso %1, trovato %2 +ErrorProgress=Progresso non valido: %1 di %2 +ErrorFileSize=Dimensione file non valida: attesa %1, trovata %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparazione all'installazione +PreparingDesc=Preparazione all'installazione di [name] nel computer. +PreviousInstallNotCompleted=L'installazione/rimozione precedente del programma non è stata completata.%n%nÈ necessario riavviare il sistema per completare l'installazione.%n%nDopo il riavvio del sistema esegui di nuovo l'installazione di [name]. +CannotContinue=L'installazione non può continuare. Seleziona "Annulla" per uscire. +ApplicationsFound=Le seguenti applicazioni stanno usando file che devono essere aggiornati dall'installazione.%n%nTi consigliamo di permettere al processo di chiudere automaticamente queste applicazioni. +ApplicationsFound2=Le seguenti applicazioni stanno usando file che devono essere aggiornati dall'installazione.%n%nTi consigliamo di permettere al processo di chiudere automaticamente queste applicazioni.%n%nAl completamento dell'installazione, il processo tenterà di riavviare le applicazioni. +CloseApplications=Chiudi &automaticamente le applicazioni +DontCloseApplications=&Non chiudere le applicazioni +ErrorCloseApplications=L'installazione non è riuscita a chiudere automaticamente tutte le applicazioni.%n%nPrima di proseguire ti raccomandiamo di chiudere tutte le applicazioni che usano file che devono essere aggiornati durante l'installazione. +PrepareToInstallNeedsRestart=Il programma di installazione deve riavviare il computer.%nDopo aver riavviato il computer esegui di nuovo il programma di installazione per completare l'installazione di [name].%n%nVuoi riavviare il computer ora? + +; *** "Installing" wizard page +WizardInstalling=Installazione in corso +InstallingLabel=Attendi il completamento dell'installazione di [name] nel computer. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Installazione di [name] completata +FinishedLabelNoIcons=Installazione di [name] completata. +FinishedLabel=Installazione di [name] completata.%n%nL'applicazione può essere eseguita selezionando le relative icone. +ClickFinish=Seleziona "Fine" per uscire dall'installazione. +FinishedRestartLabel=Per completare l'installazione di [name], è necessario riavviare il sistema.%n%nVuoi riavviare adesso? +FinishedRestartMessage=Per completare l'installazione di [name], è necessario riavviare il sistema.%n%nVuoi riavviare adesso? +ShowReadmeCheck=Si, visualizza ora il file LEGGIMI +YesRadio=&Si, riavvia il sistema adesso +NoRadio=&No, riavvia il sistema più tardi +; used for example as 'Run MyProg.exe' +RunEntryExec=Esegui %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Visualizza %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=L'installazione necessita del disco successivo +SelectDiskLabel2=Inserisci il disco %1 e seleziona "OK".%n%nSe i file di questo disco si trovano in una cartella diversa da quella visualizzata sotto, inserisci il percorso corretto o seleziona "Sfoglia". +PathLabel=&Percorso: +FileNotInDir2=Il file "%1" non è stato trovato in "%2".%n%nInserisci il disco corretto o seleziona un'altra cartella. +SelectDirectoryLabel=Specifica il percorso del prossimo disco. + +; *** Installation phase messages +SetupAborted=L'installazione non è stata completata.%n%nCorreggi il problema e riesegui nuovamente l'installazione. +AbortRetryIgnoreSelectAction=Seleziona azione +AbortRetryIgnoreRetry=&Riprova +AbortRetryIgnoreIgnore=&Ignora questo errore e continua +AbortRetryIgnoreCancel=Annulla installazione + +; *** Installation status messages +StatusClosingApplications=Chiusura applicazioni... +StatusCreateDirs=Creazione cartelle... +StatusExtractFiles=Estrazione file... +StatusCreateIcons=Creazione icone... +StatusCreateIniEntries=Creazione voci nei file INI... +StatusCreateRegistryEntries=Creazione voci di registro... +StatusRegisterFiles=Registrazione file... +StatusSavingUninstall=Salvataggio delle informazioni di disinstallazione... +StatusRunProgram=Termine dell'installazione... +StatusRestartingApplications=Riavvio applicazioni... +StatusRollback=Recupero delle modifiche... + +; *** Misc. errors +ErrorInternal2=Errore interno %1 +ErrorFunctionFailedNoCode=%1 fallito +ErrorFunctionFailed=%1 fallito; codice %2 +ErrorFunctionFailedWithMessage=%1 fallito; codice %2.%n%3 +ErrorExecutingProgram=Impossibile eseguire il file:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Errore di apertura della chiave di registro:%n%1\%2 +ErrorRegCreateKey=Errore di creazione della chiave di registro:%n%1\%2 +ErrorRegWriteKey=Errore di scrittura della chiave di registro:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Errore nella creazione delle voci INI nel file "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Salta questo file (non suggerito) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignora questo errore e continua (non suggerito) +SourceIsCorrupted=Il file sorgente è danneggiato +SourceDoesntExist=Il file sorgente "%1" non esiste +ExistingFileReadOnly2=Il file esistente non può essere sostituito in quanto segnato come in sola lettura. +ExistingFileReadOnlyRetry=&Rimuovi attributo di sola lettura e riprova +ExistingFileReadOnlyKeepExisting=&Mantieni il file esistente +ErrorReadingExistingDest=Si è verificato un errore durante la lettura del file esistente: +FileExistsSelectAction=Seleziona azione +FileExists2=Il file esiste già. +FileExistsOverwriteExisting=S&ovrascrivi il file esistente +FileExistsKeepExisting=&Mantieni il file esistente +FileExistsOverwriteOrKeepAll=&Applica questa azione per i prossimi conflitti +ExistingFileNewerSelectAction=Seleziona azione +ExistingFileNewer2=Il file esistente è più recente del file che si sta cercando di installare. +ExistingFileNewerOverwriteExisting=S&ovrascrivi il file esistente +ExistingFileNewerKeepExisting=&Mantieni il file esistente (suggerito) +ExistingFileNewerOverwriteOrKeepAll=&Applica questa azione per i prossimi conflitti +ErrorChangingAttr=Si è verificato un errore durante il tentativo di modifica dell'attributo del file esistente: +ErrorCreatingTemp=Si è verificato un errore durante la creazione di un file nella cartella di installazione: +ErrorReadingSource=Si è verificato un errore durante la lettura del file sorgente: +ErrorCopying=Si è verificato un errore durante la copia di un file: +ErrorReplacingExistingFile=Si è verificato un errore durante la sovrascrittura del file esistente: +ErrorRestartReplace=Errore durante riavvio o sostituzione: +ErrorRenamingTemp=Si è verificato un errore durante il tentativo di rinominare un file nella cartella di installazione: +ErrorRegisterServer=Impossibile registrare la DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 è fallito con codice di uscita %1 +ErrorRegisterTypeLib=Impossibile registrare la libreria di tipo: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32bit +UninstallDisplayNameMark64Bit=64bit +UninstallDisplayNameMarkAllUsers=Tutti gli utenti +UninstallDisplayNameMarkCurrentUser=Utente attuale + +; *** Post-installation errors +ErrorOpeningReadme=Si è verificato un errore durante l'apertura del file LEGGIMI. +ErrorRestartingComputer=Impossibile riavviare il sistema. Riavvia il sistema manualmente. + +; *** Uninstaller messages +UninstallNotFound=Il file "%1" non esiste.%n%nImpossibile disinstallare. +UninstallOpenError=Il file "%1" non può essere aperto.%n%nImpossibile disinstallare +UninstallUnsupportedVer=Il file registro di disinstallazione "%1" è in un formato non riconosciuto da questa versione del programma di disinstallazione.%n%nImpossibile disinstallare +UninstallUnknownEntry=Trovata una voce sconosciuta (%1) nel file registro di disinstallazione +ConfirmUninstall=Vuoi rimuovere completamente %1 e tutti i suoi componenti? +UninstallOnlyOnWin64=Questa applicazione può essere disinstallata solo in Windows a 64-bit. +OnlyAdminCanUninstall=Questa applicazione può essere disinstallata solo da un utente con privilegi di amministratore. +UninstallStatusLabel=Attendi fino a che %1 è stato rimosso dal computer. +UninstalledAll=Disinstallazione di %1 completata. +UninstalledMost=Disinstallazione di %1 completata.%n%nAlcuni elementi non possono essere rimossi.%n%nDovranno essere rimossi manualmente. +UninstalledAndNeedsRestart=Per completare la disinstallazione di %1, è necessario riavviare il sistema.%n%nVuoi riavviare il sistema adesso? +UninstallDataCorrupted=Il file "%1" è danneggiato. Impossibile disinstallare + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Vuoi rimuovere il file condiviso? +ConfirmDeleteSharedFile2=Il sistema indica che il seguente file condiviso non è più usato da nessun programma.%nVuoi rimuovere questo file condiviso?%nSe qualche programma usasse questo file, potrebbe non funzionare più correttamente.%nSe non sei sicuro, seleziona "No".%nLasciare il file nel sistema non può causare danni. +SharedFileNameLabel=Nome del file: +SharedFileLocationLabel=Percorso: +WizardUninstalling=Stato disinstallazione +StatusUninstalling=Disinstallazione di %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installazione di %1. +ShutdownBlockReasonUninstallingApp=Disinstallazione di %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versione %2 +AdditionalIcons=Icone aggiuntive: +CreateDesktopIcon=Crea un'icona sul &desktop +CreateQuickLaunchIcon=Crea un'icona nella &barra 'Avvio veloce' +ProgramOnTheWeb=Sito web di %1 +UninstallProgram=Disinstalla %1 +LaunchProgram=Avvia %1 +AssocFileExtension=&Associa i file con estensione %2 a %1 +AssocingFileExtension=Associazione dei file con estensione %2 a %1... +AutoStartProgramGroupDescription=Esecuzione automatica: +AutoStartProgram=Esegui automaticamente %1 +AddonHostProgramNotFound=Impossibile individuare %1 nella cartella selezionata.%n%nVuoi continuare ugualmente? diff --git a/installer/innosetup/Languages/Japanese.isl b/installer/innosetup/Languages/Japanese.isl new file mode 100644 index 000000000..a1c150ae6 --- /dev/null +++ b/installer/innosetup/Languages/Japanese.isl @@ -0,0 +1,367 @@ +; *** Inno Setup version 6.1.0+ Japanese messages *** +; +; Maintained by Koichi Shirasuka (shirasuka@eugrid.co.jp) +; +; Translation based on Ryou Minakami (ryou32jp@yahoo.co.jp) +; +; $jrsoftware: issrc/Files/Languages/Japanese.isl,v 1.6 2010/03/08 07:50:01 mlaan Exp $ + +[LangOptions] +LanguageName=<65E5><672C><8A9E> +LanguageID=$0411 +LanguageCodePage=932 + +[Messages] + +; *** Application titles +SetupAppTitle=ZbgAbv +SetupWindowTitle=%1 ZbgAbv +UninstallAppTitle=ACXg[ +UninstallAppFullTitle=%1 ACXg[ + +; *** Misc. common +InformationTitle= +ConfirmTitle=mF +ErrorTitle=G[ + +; *** SetupLdr messages +SetupLdrStartupMessage=%1 CXg[܂Bs܂H +LdrCannotCreateTemp=ꎞt@C쐬ł܂BZbgAbv𒆎~܂B +LdrCannotExecTemp=ꎞtH_[̃t@Csł܂BZbgAbv𒆎~܂B + +; *** Startup error messages +LastErrorMessage=%1.%n%nG[ %2: %3 +SetupFileMissing=t@C %1 ‚܂B邩VZbgAbvvO肵ĂB +SetupFileCorrupt=ZbgAbvt@CĂ܂BVZbgAbvvO肵ĂB +SetupFileCorruptOrWrongVer=ZbgAbvt@CĂ邩Ão[W̃ZbgAbvƌ݊܂B邩VZbgAbvvO肵ĂB +InvalidParameter=R}hCɕsȃp[^[n܂:%n%n%1 +SetupAlreadyRunning=ZbgAbv͊ɎsłB +WindowsVersionNotSupported=̃vO͂g̃o[W Windows T|[gĂ܂B +WindowsServicePackRequired=̃vO̎sɂ %1 Service Pack %2 ȍ~KvłB +NotOnThisPlatform=̃vO %1 ł͓삵܂B +OnlyOnThisPlatform=̃vO̎sɂ %1 KvłB +OnlyOnTheseArchitectures=̃vO%n%n%1vZbT[ Windows ɂCXg[ł܂B +WinVersionTooLowError=̃vO̎sɂ %1 %2 ȍ~KvłB +WinVersionTooHighError=̃vO %1 %2 ȍ~ł͓삵܂B +AdminPrivilegesRequired=̃vOCXg[邽߂ɂ͊Ǘ҂ƂăOCKv܂B +PowerUserPrivilegesRequired=̃vOCXg[邽߂ɂ͊Ǘ҂܂̓p[[U[ƂăOCKv܂B +SetupAppRunningError=ZbgAbv͎s %1 o܂B%n%nJĂAvP[Vׂĕ‚ĂuOKvNbNĂBuLZvNbNƁAZbgAbvI܂B +UninstallAppRunningError=ACXg[͎s %1 o܂B%n%nJĂAvP[Vׂĕ‚ĂuOKvNbNĂBuLZvNbNƁAZbgAbvI܂B + +; *** Startup questions +PrivilegesRequiredOverrideTitle=CXg[[h̑I +PrivilegesRequiredOverrideInstruction=CXg[[hIĂ +PrivilegesRequiredOverrideText1=%1 ׂ͂Ẵ[U[ (ǗҌKvł) ܂݂͌̃[U[pɃCXg[ł܂B +PrivilegesRequiredOverrideText2=%1 ݂͌̃[U[܂ׂ͂Ẵ[U[p (ǗҌKvł) ɃCXg[ł܂B +PrivilegesRequiredOverrideAllUsers=ׂẴ[U[pɃCXg[(&A) +PrivilegesRequiredOverrideAllUsersRecommended=ׂẴ[U[pɃCXg[(&A) () +PrivilegesRequiredOverrideCurrentUser=݂̃[U[pɃCXg[(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=݂̃[U[pɃCXg[(&M) () + +; *** Misc. errors +ErrorCreatingDir=fBNg %1 쐬ɃG[܂B +ErrorTooManyFilesInDir=fBNg %1 Ƀt@C쐬ɃG[܂Bt@C̐܂B + +; *** Setup common messages +ExitSetupTitle=ZbgAbvI +ExitSetupMessage=ZbgAbvƂ͊Ă܂BŃZbgAbv𒆎~ƃvO̓CXg[܂B%n%n߂ăCXg[ꍇ́AxZbgAbvsĂB%n%nZbgAbvI܂H +AboutSetupMenuItem=ZbgAbvɂ‚(&A)... +AboutSetupTitle=ZbgAbvɂ‚ +AboutSetupMessage=%1 %2%n%3%n%n%1 z[y[W:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< ߂(&B) +ButtonNext=(&N) > +ButtonInstall=CXg[(&I) +ButtonOK=OK +ButtonCancel=LZ +ButtonYes=͂(&Y) +ButtonYesToAll=ׂĂ͂(&A) +ButtonNo=(&N) +ButtonNoToAll=ׂĂ(&O) +ButtonFinish=(&F) +ButtonBrowse=Q(&B)... +ButtonWizardBrowse=Q(&R) +ButtonNewFolder=VtH_[(&M) + +; *** "Select Language" dialog messages +SelectLanguageTitle=ZbgAbvɎgp錾̑I +SelectLanguageLabel=CXg[ɗp錾IłB + +; *** Common wizard text +ClickNext=sɂ́uցvAZbgAbvIɂ́uLZvNbNĂB +BeveledLabel= +BrowseDialogTitle=tH_[Q +BrowseDialogLabel=XgtH_[I OK ĂB +NewFolderName=VtH_[ + +; *** "Welcome" wizard page +WelcomeLabel1=[name] ZbgAbvEBU[h̊Jn +WelcomeLabel2=̃vO͂gp̃Rs[^[ [name/ver] CXg[܂B%n%nsOɑ̃AvP[VׂďIĂB + +; *** "Password" wizard page +WizardPassword=pX[h +PasswordLabel1=̃CXg[vO̓pX[hɂĕی삳Ă܂B +PasswordLabel3=pX[h͂āuցvNbNĂBpX[h͑啶Əʂ܂B +PasswordEditLabel=pX[h(&P): +IncorrectPassword=͂ꂽpX[h܂Bx͂ȂĂB + +; *** "License Agreement" wizard page +WizardLicense=gp_񏑂̓ +LicenseLabel=sOɈȉ̏dvȏǂ݂B +LicenseLabel3=ȉ̎gp_񏑂ǂ݂BCXg[𑱍sɂ͂̌_񏑂ɓӂKv܂B +LicenseAccepted=ӂ(&A) +LicenseNotAccepted=ӂȂ(&D) + +; *** "Information" wizard pages +WizardInfoBefore= +InfoBeforeLabel=sOɈȉ̏dvȏǂ݂B +InfoBeforeClickLabel=ZbgAbv𑱍sɂ́uցvNbNĂB +WizardInfoAfter= +InfoAfterLabel=sOɈȉ̏dvȏǂ݂B +InfoAfterClickLabel=ZbgAbv𑱍sɂ́uցvNbNĂB + +; *** "User Information" wizard page +WizardUserInfo=[U[ +UserInfoDesc=[U[͂ĂB +UserInfoName=[U[(&U): +UserInfoOrg=gD(&O): +UserInfoSerial=VAԍ(&S): +UserInfoNameRequired=[U[͂ĂB + +; *** "Select Destination Location" wizard page +WizardSelectDir=CXg[̎w +SelectDirDesc=[name] ̃CXg[w肵ĂB +SelectDirLabel3=[name] CXg[tH_w肵āAuցvNbNĂB +SelectDirBrowseLabel=ɂ́uցvNbNĂBʂ̃tH_[Iɂ́uQƁvNbNĂB +DiskSpaceGBLabel=̃vO͍Œ [gb] GB ̃fBXN󂫗̈KvƂ܂B +DiskSpaceMBLabel=̃vO͍Œ [mb] MB ̃fBXN󂫗̈KvƂ܂B +CannotInstallToNetworkDrive=lbg[NhCuɃCXg[邱Ƃ͂ł܂B +CannotInstallToUNCPath=UNC pXɃCXg[邱Ƃ͂ł܂B +InvalidPath=hCu܂ފSȃpX͂ĂB%n%nFC:\APP%n%n܂ UNC `̃pX͂ĂB%n%nF\\server\share +InvalidDrive=w肵hCu܂ UNC pX‚ȂANZXł܂Bʂ̃pXw肵ĂB +DiskSpaceWarningTitle=fBXN󂫗̈̕s +DiskSpaceWarning=CXg[ɂ͍Œ %1 KB ̃fBXN󂫗̈悪KvłAw肳ꂽhCuɂ %2 KB ̋󂫗̈悵܂B%n%n̂܂ܑs܂H +DirNameTooLong=hCu܂̓pX߂܂B +InvalidDirName=tH_[łB +BadDirName32=ȉ̕܂ރtH_[͎wł܂B:%n%n%1 +DirExistsTitle=̃tH_[ +DirExists=tH_[ %n%n%1%n%nɑ݂܂B̂܂܂̃tH_[փCXg[܂H +DirDoesntExistTitle=tH_[‚܂B +DirDoesntExist=tH_[ %n%n%1%n%n‚܂BVtH_[쐬܂H + +; *** "Select Components" wizard page +WizardSelectComponents=R|[lg̑I +SelectComponentsDesc=CXg[R|[lgIĂB +SelectComponentsLabel2=CXg[R|[lgIĂBCXg[Kv̂ȂR|[lg̓`FbNOĂBsɂ́uցvNbNĂB +FullInstallation=tCXg[ +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=RpNgCXg[ +CustomInstallation=JX^CXg[ +NoUninstallWarningTitle=̃R|[lg +NoUninstallWarning=ZbgAbv͈ȉ̃R|[lgɃCXg[Ă邱Ƃo܂B%n%n%1%n%ñR|[lg̑IĂACXg[͂܂B%n%n̂܂ܑs܂H +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=݂̑I͍Œ [gb] GB ̃fBXN󂫗̈KvƂ܂B +ComponentsDiskSpaceMBLabel=݂̑I͍Œ [mb] MB ̃fBXN󂫗̈KvƂ܂B + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=lj^XN̑I +SelectTasksDesc=slj^XNIĂB +SelectTasksLabel2=[name] CXg[Ɏslj^XNIāAuցvNbNĂB + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=X^[gj[tH_[̎w +SelectStartMenuFolderDesc=vÕV[gJbg쐬ꏊw肵ĂB +SelectStartMenuFolderLabel3=ZbgAbṽ͎X^[gj[tH_[ɃvÕV[gJbg쐬܂B +SelectStartMenuFolderBrowseLabel=ɂ́uցvNbNĂBႤtH_[Iɂ́uQƁvNbNĂB +MustEnterGroupName=tH_[w肵ĂB +GroupNameTooLong=tH_[܂̓pX߂܂B +InvalidGroupName=tH_[łB +BadGroupName=̕܂ރtH_[͎wł܂:%n%n%1 +NoProgramGroupCheck2=X^[gj[tH_[쐬Ȃ(&D) + +; *** "Ready to Install" wizard page +WizardReady=CXg[ +ReadyLabel1=gp̃Rs[^ [name] CXg[鏀ł܂B +ReadyLabel2a=CXg[𑱍sɂ́uCXg[vAݒ̊mFύXsɂ́u߂vNbNĂB +ReadyLabel2b=CXg[𑱍sɂ́uCXg[vNbNĂB +ReadyMemoUserInfo=[U[: +ReadyMemoDir=CXg[: +ReadyMemoType=ZbgAbv̎: +ReadyMemoComponents=IR|[lg: +ReadyMemoGroup=X^[gj[tH_[: +ReadyMemoTasks=lj^XNꗗ: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=lj̃t@C_E[hĂ܂... +ButtonStopDownload=_E[h𒆎~(&S) +StopDownload=_E[h𒆎~Ă낵łH +ErrorDownloadAborted=_E[h𒆎~܂ +ErrorDownloadFailed=_E[hɎs܂: %1 %2 +ErrorDownloadSizeFailed=TCY̎擾Ɏs܂: %1 %2 +ErrorFileHash1=t@C̃nbVɎs܂: %1 +ErrorFileHash2=ȃt@CnbV: \ꂽl %1, ۂ̒l %2 +ErrorProgress=Ȑis: %1 / %2 +ErrorFileSize=ȃt@CTCY: \ꂽl %1, ۂ̒l %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=CXg[ +PreparingDesc=gp̃Rs[^[ [name] CXg[鏀Ă܂B +PreviousInstallNotCompleted=OsAvP[ṼCXg[܂͍폜Ă܂Bɂ̓Rs[^[ċNKv܂B%n%n[name] ̃CXg[邽߂ɂ́AċNɂxZbgAbvsĂB +CannotContinue=ZbgAbv𑱍sł܂BuLZvNbNăZbgAbvIĂB +ApplicationsFound=ȉ̃AvP[VZbgAbvɕKvȃt@CgpĂ܂BZbgAbvɎIɃAvP[VI邱Ƃ𐄏܂B +ApplicationsFound2=ȉ̃AvP[VZbgAbvɕKvȃt@CgpĂ܂BZbgAbvɎIɃAvP[VI邱Ƃ𐄏܂BCXg[̊AZbgAbv̓AvP[V̍ċN݂܂B +CloseApplications=IɃAvP[VI(&A) +DontCloseApplications=AvP[VIȂ(&D) +ErrorCloseApplications=ZbgAbvׂ͂ẴAvP[VIɏI邱Ƃł܂łBZbgAbv𑱍sOɁAXV̕Kvȃt@CgpĂ邷ׂẴAvP[VI邱Ƃ𐄏܂B +PrepareToInstallNeedsRestart=ZbgAbv̓Rs[^[ċNKv܂BRs[^[ċNAZbgAbvēxs [name] ̃CXg[ĂB%n%nɍċN܂H? + +; *** "Installing" wizard page +WizardInstalling=CXg[ +InstallingLabel=gp̃Rs[^[ [name] CXg[Ă܂B΂炭҂B + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=[name] ZbgAbvEBU[h̊ +FinishedLabelNoIcons=gp̃Rs[^[ [name] ZbgAbv܂B +FinishedLabel=gp̃Rs[^[ [name] ZbgAbv܂BAvP[Vsɂ̓CXg[ꂽV[gJbgIĂB +ClickFinish=ZbgAbvIɂ́uvNbNĂB +FinishedRestartLabel=[name] ̃CXg[邽߂ɂ́ARs[^[ċNKv܂BɍċN܂H +FinishedRestartMessage=[name] ̃CXg[邽߂ɂ́ARs[^[ċNKv܂B%n%nɍċN܂H +ShowReadmeCheck=README t@C\B +YesRadio=ɍċN(&Y) +NoRadio=Ŏ蓮ōċN(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec=%1 ̎s +; used for example as 'View Readme.txt' +RunEntryShellExec=%1 ̕\ + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=fBXN̑} +SelectDiskLabel2=fBXN %1 }AuOKvNbNĂB%n%ñfBXÑt@Cɕ\ĂtH_[ȊȌꏊɂꍇ́ApX͂邩uQƁv{^NbNĂB +PathLabel=pX(&P): +FileNotInDir2=t@C %1 %2 Ɍ‚܂BfBXN}邩Aʂ̃tH_[w肵ĂB +SelectDirectoryLabel=̃fBXN̂ꏊw肵ĂB + +; *** Installation phase messages +SetupAborted=ZbgAbv͊Ă܂B%n%nĂAxZbgAbvsĂB +AbortRetryIgnoreSelectAction=ANVIĂ +AbortRetryIgnoreRetry=Ďs(&T) +AbortRetryIgnoreIgnore=G[𖳎đs(&I) +AbortRetryIgnoreCancel=CXg[LZ + +; *** Installation status messages +StatusClosingApplications=AvP[VIĂ܂... +StatusCreateDirs=tH_[쐬Ă܂... +StatusExtractFiles=t@CWJĂ܂... +StatusCreateIcons=V|gJbg쐬Ă܂... +StatusCreateIniEntries=INIt@Cݒ肵Ă܂... +StatusCreateRegistryEntries=WXgݒ肵Ă܂... +StatusRegisterFiles=t@Co^Ă܂... +StatusSavingUninstall=ACXg[ۑĂ܂... +StatusRunProgram=CXg[Ă܂... +StatusRestartingApplications=AvP[VċNĂ܂... +StatusRollback=ύXɖ߂Ă܂... + +; *** Misc. errors +ErrorInternal2=G[: %1 +ErrorFunctionFailedNoCode=%1 G[ +ErrorFunctionFailed=%1 G[: R[h %2 +ErrorFunctionFailedWithMessage=%1 G[: R[h %2.%n%3 +ErrorExecutingProgram=t@CsG[:%n%1 + +; *** Registry errors +ErrorRegOpenKey=WXgL[I[vG[:%n%1\%2 +ErrorRegCreateKey=WXgL[쐬G[:%n%1\%2 +ErrorRegWriteKey=WXgL[݃G[:%n%1\%2 + +; *** INI errors +ErrorIniEntry=INIt@CGg쐬G[: t@C %1 + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=̃t@CXLbv(&S) (܂) +FileAbortRetryIgnoreIgnoreNotRecommended=G[𖳎đs(&I) (܂) +SourceIsCorrupted=Rs[̃t@CĂ܂B +SourceDoesntExist=Rs[̃t@C %1 ‚܂B +ExistingFileReadOnly2=̃t@C͓ǂݎp̂ߒuł܂B +ExistingFileReadOnlyRetry=ǂݎpĂxȂ(&R) +ExistingFileReadOnlyKeepExisting=̃t@Cc(&K) +ErrorReadingExistingDest=̃t@CǂݍݒɃG[܂: +FileExistsSelectAction=ANVIĂ +FileExists2=t@C͊ɑ݂܂B +FileExistsOverwriteExisting=̃t@C㏑(&O) +FileExistsKeepExisting=̃t@Cێ(&K) +FileExistsOverwriteOrKeepAll=ȍ~̋ɓs(&D) +ExistingFileNewerSelectAction=ANVIĂ +ExistingFileNewer2=ZbgAbvCXg[悤ƂĂ̂Vt@C܂B +ExistingFileNewerOverwriteExisting=̃t@C㏑(&O) +ExistingFileNewerKeepExisting=̃t@Cێ(&K) () +ExistingFileNewerOverwriteOrKeepAll=ȍ~̋ɓs(&D) +ErrorChangingAttr=t@C̑ύXɃG[܂: +ErrorCreatingTemp=Rs[̃tH_[Ƀt@C쐬ɃG[܂: +ErrorReadingSource=Rs[̃t@CǂݍݒɃG[܂: +ErrorCopying=t@CRs[ɃG[܂: +ErrorReplacingExistingFile=̃t@CuɃG[܂: +ErrorRestartReplace=ċNɂu̎sɎs܂: +ErrorRenamingTemp=Rs[tH_[̃t@CύXɃG[܂: +ErrorRegisterServer=DLL/OCX̓o^Ɏs܂: %1 +ErrorRegSvr32Failed=RegSvr32͏IR[h %1 ɂ莸s܂ +ErrorRegisterTypeLib=^CvCuւ̓o^Ɏs܂: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 rbg +UninstallDisplayNameMark64Bit=64 rbg +UninstallDisplayNameMarkAllUsers=ׂẴ[U[ +UninstallDisplayNameMarkCurrentUser=݂̃[U[ + +; *** Post-installation errors +ErrorOpeningReadme=README t@C̃I[vɎs܂B +ErrorRestartingComputer=Rs[^[̍ċNɎs܂B蓮ōċNĂB + +; *** Uninstaller messages +UninstallNotFound=t@C "%1" ‚܂BACXg[sł܂B +UninstallOpenError=t@C "%1" JƂł܂BACXg[sł܂B +UninstallUnsupportedVer=ACXg[Ot@C "%1" ́Ão[W̃ACXg[vOFłȂ`łBACXg[sł܂B +UninstallUnknownEntry=ACXg[Oɕs̃Gg (%1) ‚܂B +ConfirmUninstall=%1 Ƃ̊֘AR|[lgׂč폜܂B낵łH +UninstallOnlyOnWin64=̃vO64 rbgWindowsł̂݃ACXg[邱Ƃł܂B +OnlyAdminCanUninstall=ACXg[邽߂ɂ͊ǗҌKvłB +UninstallStatusLabel=gp̃Rs[^[ %1 폜Ă܂B΂炭҂B +UninstalledAll=%1 ͂gp̃Rs[^[琳ɍ폜܂B +UninstalledMost=%1 ̃ACXg[܂B%n%n‚̍ڂ폜ł܂łB蓮ō폜ĂB +UninstalledAndNeedsRestart=%1 ̍폜邽߂ɂ́ARs[^[ċNKv܂BɍċN܂H +UninstallDataCorrupted=t@C "%1" Ă܂BACXg[sł܂B + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Lt@C̍폜 +ConfirmDeleteSharedFile2=VXeŁA̋Lt@C͂ǂ̃vOłgpĂ܂B̋Lt@C폜܂H%n%ñvO܂̃t@CgpꍇA폜ƃvO삵ȂȂ鋰ꂪ܂B܂młȂꍇ́uvIĂBVXeɃt@CcĂNƂ͂܂B +SharedFileNameLabel=t@C: +SharedFileLocationLabel=ꏊ: +WizardUninstalling=ACXg[ +StatusUninstalling=%1 ACXg[Ă܂... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=%1 CXg[łB +ShutdownBlockReasonUninstallingApp=%1 ACXg[łB + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 o[W %2 +AdditionalIcons=ACRlj: +CreateDesktopIcon=fXNgbvɃACR쐬(&D) +CreateQuickLaunchIcon=NCbNNACR쐬(&Q) +ProgramOnTheWeb=%1 on the Web +UninstallProgram=%1 ACXg[ +LaunchProgram=%1 s +AssocFileExtension=t@Cgq %2 %1 ֘At܂B +AssocingFileExtension=t@Cgq %2 %1 ֘AtĂ܂... +AutoStartProgramGroupDescription=X^[gAbv: +AutoStartProgram=%1 IɊJn +AddonHostProgramNotFound=IꂽtH_[ %1 ‚܂łB%n%n̂܂ܑs܂H \ No newline at end of file diff --git a/installer/innosetup/Languages/Lithuanian.isl b/installer/innosetup/Languages/Lithuanian.isl index b3e220036..74c99b2cd 100644 --- a/installer/innosetup/Languages/Lithuanian.isl +++ b/installer/innosetup/Languages/Lithuanian.isl @@ -1,7 +1,7 @@ -; *** Inno Setup version 6.0.3+ Lithuanian messages *** +; *** Inno Setup version 6.1.0+ Lithuanian messages *** ; ; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ +; https://jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno @@ -165,9 +165,9 @@ DiskSpaceWarning=Diegimui reikia bent %1 KB laisvos vietos, bet nurodytame diske DirNameTooLong=Katalogo pavadinimas ar kelias iki jo per ilgas. InvalidDirName=Nekorektikas katalogo pavadinimas. BadDirName32=Katalogo pavadinime neturi bti simboli:%n%n%1 -DirExistsTitle=Toks katalogas egzistuoja -DirExists=Katalogas:%n%n%1%n%n jau egzistuoja. Vis tiek norite diegti program tame kataloge? -DirDoesntExistTitle=Toks katalogas neegzistuoja. +DirExistsTitle=Tokio katalogo nra +DirExists=Katalogas:%n%n%1%n%n jau yra. Vis tiek norite diegti program tame kataloge? +DirDoesntExistTitle=Tokio katalogo nra. DirDoesntExist=Katalogas:%n%n%1%n%n neegzistuoja. Norite kad katalogas bt sukurtas? ; *** "Select Components" wizard page @@ -213,6 +213,18 @@ ReadyMemoComponents=Pasirinkti komponentai: ReadyMemoGroup=Start Menu katalogas: ReadyMemoTasks=Papildomi veiksmai: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Parsisiuniami papildomi failai... +ButtonStopDownload=&Stabdyti parsisiuntim +StopDownload=Ar tikrai norite sustabdyti parsisiuntim? +ErrorDownloadAborted=Parsisiuntimas nutrauktas +ErrorDownloadFailed=Parsisisti nepavyko: %1 %2 +ErrorDownloadSizeFailed=Nepavyko gauti dydio: %1 %2 +ErrorFileHash1=Failo patikrinimas nepavyko: %1 +ErrorFileHash2=Neteisinga failo hash reikm: numatyta %1, rasta %2 +ErrorProgress=Netinkama eiga: %1 i %2 +ErrorFileSize=Neteisingas failo dydis: numatytas %1, rastas %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Pasirengimas diegimui PreparingDesc=Diegimo programa pasirengusi [name] diegimui Js kompiuteryje. @@ -290,18 +302,27 @@ ErrorIniEntry=Klaida ra FileAbortRetryIgnoreSkipNotRecommended=Pralei&sti fail (nerekomenduojama) FileAbortRetryIgnoreIgnoreNotRecommended=&Ignoruoti klaid ir tsti (nerekomenduojama) SourceIsCorrupted=Pradinis failas sugadintas -SourceDoesntExist=Pradinis failas %1 neegzistuoja -ExistingFileReadOnly2=Egzistuojantis failas yra paymtas Tik skaitymui todl negali bti pakeistas. +SourceDoesntExist=Pradinio failo %1 nra +ExistingFileReadOnly2=Esamas failas yra paymtas Tik skaitymui todl negali bti pakeistas. ExistingFileReadOnlyRetry=Paalinkite at&ribut Tik skaitymui ir bandykite vl -ExistingFileReadOnlyKeepExisting=Pali&kti egzistuojant fail -ErrorReadingExistingDest=Skaitant egzistuojant fail vyko klaida: -FileExists=Toks failas jau egzistuoja.%n%nNorite, kad diegimo programa perrayt fail? -ExistingFileNewer=Egzistuojantis failas yra naujesnis u t, kur diegimo programa bando rayti. Rekomenduojama palikti esant naujesn fail.%n%nNorite palikti naujesn fail? +ExistingFileReadOnlyKeepExisting=Pali&kti esam fail +ErrorReadingExistingDest=Skaitant esam fail vyko klaida: +FileExistsSelectAction=Pasirinkite veiksm +FileExists2=Toks failas jau yra. +FileExistsOverwriteExisting=&Perrayti esam fail +FileExistsKeepExisting=Pali&kti esam fail +FileExistsOverwriteOrKeepAll=&Daryti taip ir esant kitiems konfliktams +ExistingFileNewerSelectAction=Pasirinkite veiksm +ExistingFileNewer=Esamas failas yra naujesnis u t, kur diegimo programa bando rayti. Rekomenduojama palikti esam fail.%n%nPalikti naujesn fail? +ExistingFileNewer2=Esamas failas yra naujesnis u t, kur diegimo programa bando rayti. +ExistingFileNewerOverwriteExisting=&Perrayti esam fail +ExistingFileNewerKeepExisting=Pali&kti esam fail (rekomenduojama) +ExistingFileNewerOverwriteOrKeepAll=&Daryti taip ir esant kitiems konfliktams ErrorChangingAttr=Keiiant failo atributus vyko klaida: ErrorCreatingTemp=Kuriant fail pasirinktame kataloge vyko klaida: ErrorReadingSource=Skaitant diegiamj fail vyko klaida: ErrorCopying=Kopijuojant fail vyko klaida: -ErrorReplacingExistingFile=Perraant egzistuojant fail vyko klaida: +ErrorReplacingExistingFile=Perraant esam fail vyko klaida: ErrorRestartReplace=Perkrovimas/Perraymas nepavyko: ErrorRenamingTemp=Pervadinant fail pasirinktame kataloge vyko klaida: ErrorRegisterServer=Nepavyko uregistruoti DLL/OCX bibliotekos: %1 @@ -323,7 +344,7 @@ ErrorOpeningReadme=Bandant atidaryti ErrorRestartingComputer=Diegimo programa negali perkrauti kompiuterio. Perkraukite kompiuter prastu bdu. ; *** Uninstaller messages -UninstallNotFound=%1 failas neegzistuoja. Paalinti nemanoma. +UninstallNotFound=%1 failo nra. Paalinti nemanoma. UninstallOpenError=%1 failas negali bti atidarytas. Paalinti nemanoma. UninstallUnsupportedVer=Paalinimo urnalo failas %1 yra paalinimo programai nesuprantamo formato. Paalinti nemanoma. UninstallUnknownEntry=Neinomas raas (%1) rastas paalinimo urnalo faile. @@ -362,6 +383,6 @@ UninstallProgram=Pa LaunchProgram=Paleisti %1 AssocFileExtension=&Susieti %1 program su failo pltiniu %2 AssocingFileExtension=%1 programa susiejama su failo pltiniu %2... -AutoStartProgramGroupDescription=Atomatin paleistis: -AutoStartProgram=Atomatikai paleisti %1 +AutoStartProgramGroupDescription=Automatin paleistis: +AutoStartProgram=Automatikai paleisti %1 AddonHostProgramNotFound=%1 nerasta Js nurodytame kataloge.%n%nVis tiek norite tsti? diff --git a/installer/innosetup/Languages/Montenegrin.isl b/installer/innosetup/Languages/Montenegrin.isl new file mode 100644 index 000000000..0a306d189 --- /dev/null +++ b/installer/innosetup/Languages/Montenegrin.isl @@ -0,0 +1,386 @@ +; *** Inno Setup version 6.1.0+ Montenegrin messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Translated by Drazen Djurisic (kntaur@gmail.com) +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Crnogorski +LanguageID=$081a +LanguageCodePage=1250 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalacija +SetupWindowTitle=Instalacija - %1 +UninstallAppTitle=Deinstalacija +UninstallAppFullTitle=Deinstalacija programa %1 + +; *** Misc. common +InformationTitle=Podaci +ConfirmTitle=Potvrda +ErrorTitle=Greka + +; *** SetupLdr messages +SetupLdrStartupMessage=Instalirat e te %1. elite li da nastavite? +LdrCannotCreateTemp=Ne mogu da napravim privremenu datoteku. Instalacija obustavljena +LdrCannotExecTemp=Ne mogu da pokrenem datoteku u privremenom direktorijumu. Instalacija obustavljena +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nGreka %2: %3 +SetupFileMissing=Datoteka %1 nedostaje u instalacionom direktorijumu. Ispravite problem ili nabavite novi primjerak programa. +SetupFileCorrupt=Instalacione datoteke su otecene. Nabavite novi primjerak programa. +SetupFileCorruptOrWrongVer=Instalacione datoteke su otecene, ili su nekompatibilne sa ovom verzijom instalacije. Ispravite problem ili nabavite novi primjerak programa. +InvalidParameter=Neispravan parametar je prenijet na komandnu liniju:%n%n%1 +SetupAlreadyRunning=Instalacija je vec pokrenuta. +WindowsVersionNotSupported=Ova verzija programa nije kompatibilna sa verzijom windows'-a na vaem racunaru. +WindowsServicePackRequired=Ovaj program zahtijeva %1 servisni paket %2 ili noviji. +NotOnThisPlatform=Program nece raditi na %1. +OnlyOnThisPlatform=Program ce raditi na %1. +OnlyOnTheseArchitectures=Program se moe instalirati samo na verzijama windows-a koji rade na sledecim arhitekturama procesora:%n%n%1 +WinVersionTooLowError=Ovaj program zahtijeva %1 verziju %2 ili noviju. +WinVersionTooHighError=Program se ne moe instalirati na %1 verziju %2 ili noviju. +AdminPrivilegesRequired=Morate biti prijavljeni kao administrator da bi ste instalirali program. +PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili ovlaceni korisnik da bi ste instalirali ovaj program. +SetupAppRunningError=Program %1 je trenutno pokrenut.%n%nUgasite ga, kliknite "U redu", ili "Obustavi" za napustite instalaciju. +UninstallAppRunningError=Program %1 je trenutno pokrenut.%n%nUgasite ga, kliknite "U redu", ili "Obustavi" za napustite instalaciju. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Izaberite nacin instalacije +PrivilegesRequiredOverrideInstruction=Izaberite nacin instalacije +PrivilegesRequiredOverrideText1=%1 moe biti instaliran za sve korisnike (zahtijeva administratorske privilegije), ili samo za vas. +PrivilegesRequiredOverrideText2=%1 moe biti instaliran za vas samo, ili za sve korisnike (zahtijeva administratorske privilegije). +PrivilegesRequiredOverrideAllUsers=Instalacija za &sve korisnike +PrivilegesRequiredOverrideAllUsersRecommended=Instalacija za &sve korisnike (preporucuje se) +PrivilegesRequiredOverrideCurrentUser=Instalacija &za vas samo +PrivilegesRequiredOverrideCurrentUserRecommended=Instalacija &za vas samo (preporucuje se) + +; *** Misc. errors +ErrorCreatingDir=Instalacija ne moe da napravi direktorijum "%1" +ErrorTooManyFilesInDir=Ne mogu da napravim datoteku u direktorijumu "%1" zato to sadri previe datoteka + +; *** Setup common messages +ExitSetupTitle=Napusti instalaciju +ExitSetupMessage=Instalacija nije kompletna. Ako izadete sad, program nece biti instaliran.%n%nMoete pokrenuti instalaciju neki drugi put da zavrite instaliranje.%n%nNapusti instalaciju? +AboutSetupMenuItem=&O programu... +AboutSetupTitle=O programu +AboutSetupMessage=%1 verzija %2%n%3%n%n%1 internet stranica:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< &Nazad +ButtonNext=&Dalje > +ButtonInstall=&Instaliraj +ButtonOK=U redu +ButtonCancel=Obustavi +ButtonYes=&Da +ButtonYesToAll=Da za &sve +ButtonNo=&Ne +ButtonNoToAll=N&e za sve +ButtonFinish=&Zavri +ButtonBrowse=&Pretrai... +ButtonWizardBrowse=P&retrai... +ButtonNewFolder=&Napravi novi direktorijum + +; *** "Select Language" dialog messages +SelectLanguageTitle=Izaberite jezik instalacije +SelectLanguageLabel=Izaberite jezik koji ce te koristiti tokom instalacije. + +; *** Common wizard text +ClickNext=Kliknite "Dalje" za nastavak, ili "Obustavi" da prekinete instalaciju. +BeveledLabel= +BrowseDialogTitle=Izaberite direktorijum +BrowseDialogLabel=Izaberite direktorijum sa liste ispod, onda kliknite na "U redu". +NewFolderName=Novi direktorijum + +; *** "Welcome" wizard page +WelcomeLabel1=Dobro doli na instalaciju programa [name] +WelcomeLabel2=Instalirat ce te [name/ver] na vaem racunaru.%n%nPreporucujemo da zatvorite sve ostale programe pa da nastavite sa instalacijom. + +; *** "Password" wizard page +WizardPassword=Lozinka +PasswordLabel1=Instalacija je zaticena lozinkom. +PasswordLabel3=Unesite lozinku i kliknite "Dalje" da nastavite. Lozinka je osjetljiva na velika i mala slova. +PasswordEditLabel=&Lozinka: +IncorrectPassword=Lozinka koju ste unijeli je netacna. Probajte opet. + +; *** "License Agreement" wizard page +WizardLicense=Ugovor o licenci +LicenseLabel=Paljivo procitajte sledece prije nego nastavite. +LicenseLabel3=Procitajte ugovor o licenci koji je ispod. Morate prihvatiti uslove ugovora ako elite da nastavite sa instalacijom. +LicenseAccepted=&Prihvatam ugovor +LicenseNotAccepted=&Ne prihvatam ugovor + +; *** "Information" wizard pages +WizardInfoBefore=Informacije +InfoBeforeLabel=Paljivo procitajte sledece prije nego nastavite. +InfoBeforeClickLabel=Kada budete spremni da nastavite instalaciju, kliknite "Dalje". +WizardInfoAfter=Informacije +InfoAfterLabel=Paljivo procitajte sledece prije nego nastavite. +InfoAfterClickLabel=Kada budete spremni da nastavite instalaciju, kliknite "Dalje". + +; *** "User Information" wizard page +WizardUserInfo=Podaci o korisniku +UserInfoDesc=Unesite vae podatke. +UserInfoName=&Korisnik: +UserInfoOrg=&Organizacija: +UserInfoSerial=&Serijski broj: +UserInfoNameRequired=Morate unijeti ime. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Izaberite lokaciju +SelectDirDesc=Gdje ce [name] biti instaliran? +SelectDirLabel3=Program [name] ce biti instaliran u direktorijumu. +SelectDirBrowseLabel=Za nastavak pritisnite "Dalje". Ako elite drugi direktorijum, pritisnite "Potrai". +DiskSpaceGBLabel=Potrebno je najmanje [gb] GB slobodnog prostora na disku. +DiskSpaceMBLabel=Potrebno je najmanje [mb] MB slobodnog prostora na disku. +CannotInstallToNetworkDrive=Program ne moete instalirati na mrenom disku. +CannotInstallToUNCPath=Program ne moete instalirati na UNC putanji. +InvalidPath=Morate navesti cijelu putanju sa oznakom diska; npr:%n%nC:\APP%n%nili UNC putanja u obliku:%n%n\\server\share +InvalidDrive=Disk ili UNC koji ste naveli ne postoji ili nije dostupan. Izaberite drugi. +DiskSpaceWarningTitle=Nema dovoljno prostora na disku +DiskSpaceWarning=Programu je potrebno %1 KB slobodnog prostora za instalaciju, ali izabrani disk ima samo %2 KB.%n%nDa li elite da nastavite bez obzira? +DirNameTooLong=Ime direktorijuma ili putanja je predugacka. +InvalidDirName=Ime direktorijuma nije valjano. +BadDirName32=Ime direktorijuma ne moe da sadri nijedan od sledecih karaktera:%n%n%1 +DirExistsTitle=Direktorijum vec postoji +DirExists=Direktorijum:%n%n%1%n%nvec postoji. elite ili da nastavite sa instalcijom u postojeci direktorijum? +DirDoesntExistTitle=Direktorijum ne postoji +DirDoesntExist=Direktorijum:%n%n%1%n%nne postoji. elite li da kreiramo navedeni direktorijum? + +; *** "Select Components" wizard page +WizardSelectComponents=Odabir komponenata +SelectComponentsDesc=Koje komponente elite da instalirate? +SelectComponentsLabel2=Izaberite komponente koje elite da instalirate; ocistite komponente koje ne elite. Kliknite "Dalje" za nastavak instalacije. +FullInstallation=Kompletna instalacija +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Podrazumijevana instalacija +CustomInstallation=Prilagodjena instalacija +NoUninstallWarningTitle=Komponenta postoji +NoUninstallWarning=Program je pronaao da su sledece komponente vec instalirane:%n%n%1%n%nŠtrikiranjem ovih komponenti one nece biti deinstalirane.%n%nDa li elite da nastavite? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Izabrane stavke zahtijevaju najmanje [gb] GB prostora na disku. +ComponentsDiskSpaceMBLabel=Izabrane stavke zahtijevaju najmanje [mb] MB prostora na disku. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Odabir dodatnih zadataka +SelectTasksDesc=Koje dodatne zadatke elite program da izvri? +SelectTasksLabel2=Izaberite dodatne zadatke koje zelite da [name] izvri, onda kliknite "Dalje". + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Odabir direktorijuma u meniju "Start" +SelectStartMenuFolderDesc=Izaberite mjesto gdje elite da budu precice? +SelectStartMenuFolderLabel3=Instalacija ce postaviti precice u sledecem direktorijumu "Start" menija. +SelectStartMenuFolderBrowseLabel=Za nastavak pritisnite "Dalje". Ako elite drugi direktorijum pritisnite "Potrai". +MustEnterGroupName=Morate unijeti ime direktorijuma. +GroupNameTooLong=Ime direktorijuma ili putanje je predugacko. +InvalidGroupName=Ime direktorijuma nije valjano. +BadGroupName=Naziv direktorijuma ne smije da sadri sledece karaktere:%n%n%1 +NoProgramGroupCheck2=&Nemoj kreirati direktorijum u "Start" meniju + +; *** "Ready to Install" wizard page +WizardReady=Spreman za instalaciju +ReadyLabel1=Program je spreman da instalira [name] na vaem racunaru. +ReadyLabel2a=Klikni "Instaliraj" da zapocnete instalaciju ili "Nazad" da ponovo pogledate i promijenite pojedine stavke. +ReadyLabel2b=Klikni "Instaliraj" da zapocnete instalaciju. +ReadyMemoUserInfo=Podaci o korisniku: +ReadyMemoDir=Lokacija direktorijuma: +ReadyMemoType=Vrsta instalacije: +ReadyMemoComponents=Izabrane komponente: +ReadyMemoGroup=Direktorijum u meniju "Start": +ReadyMemoTasks=Dodatni zadaci: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Snimam dodatne datoteke... +ButtonStopDownload=&Zaustavi snimanje +StopDownload=Jeste li sigurni da elite da zaustavite snimanje? +ErrorDownloadAborted=Snimanje obustavljeno +ErrorDownloadFailed=Snimanje neuspjeno: %1 %2 +ErrorDownloadSizeFailed=informacije o velicini netacne: %1 %2 +ErrorFileHash1=Hash identifikacija datoteke netacna: %1 +ErrorFileHash2=Netacna hash identifikacija datoteke: ocekivan %1, naden %2 +ErrorProgress=Neispravan progres: %1 of %2 +ErrorFileSize=Neispravna velicina datoteke: ocekivana %1, nadena %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Priprema za instalaciju +PreparingDesc=Program se sprema da instalira [name] na vaem racunaru. +PreviousInstallNotCompleted=Instalacija ili deinstalacija prethodnog programa nije zavrena. Potrebno je da restartujete racunar da bi se instalacija zavrila.%n%nNakon restarta racunara pokrenite instalaciju ponovo da bi se [name] instalirao. +CannotContinue=Instalacija nije moguca. Kliknite "Otkai" da izadete. +ApplicationsFound=Sledeci programi koriste datoteke koje treba da aurira instalacioni program. Preporucujemo da dozvolite instalacionom programu da zatvori ove programe. +ApplicationsFound2=Sledeci programi koriste datoteke koje treba da aurira instalacioni program. Preporucujemo da dozvolite instalacionom programu da zatvori ove programe. Nakon kompletirane instalacije, instalacija ce pokuati da restartuje program . +CloseApplications=&Automatski zatvorite program +DontCloseApplications=&Ne zatvaraj program +ErrorCloseApplications=Ne mogu da zatvorim sve programe. Preporucujemo da ugasite sve programe cije datoteke treba da nadogradi instlacija. +PrepareToInstallNeedsRestart=Instalacija mora da restartuje racunar. Nakon restarta racunara, pokrenite instalaciju [name] da bi dovrili instalaciju.%n%nelite li da restartujete racunar? + +; *** "Installing" wizard page +WizardInstalling=Instaliram +InstallingLabel=Sacekajte da program instalira [name] na va racunar. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Zavravam sa instalacijom [name] +FinishedLabelNoIcons=Instalacija [name] je zavrena na vaem racunaru. +FinishedLabel=Instalacija [name] je zavrena. Program moete startovati klikom na instaliranu precicu. +ClickFinish=Kliknite na "Zavri" da izadete. +FinishedRestartLabel=Da bi instalacija [name] bila kompletna, program mora restartovati racunar. Restartovanje racunara? +FinishedRestartMessage=Da bi instalacija [name] bila kompletna, program mora restartovati racunar.%n%nRestartovanje racunara? +ShowReadmeCheck=Da, elim da pogledam tekstualnu datoteku +YesRadio=&Da, restartovacu racunar sada +NoRadio=&Ne, restartovacu racunar kasnije +; used for example as 'Run MyProg.exe' +RunEntryExec=Run %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=View %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Sledeci disk +SelectDiskLabel2=Ubacite disk %1 i kliknite "U redu".%n%nAko se datoteke na ovom disku mogu pronaci u nekom drugom direktorijumu, unesite odgovarajucu putanju ili kliknite na „Potrai“ +PathLabel=&Path: +FileNotInDir2=Datoteka "%1" ne postoji na lokaciji "%2". Ubacite pravi disk ili izaberite drugi direktorijum. +SelectDirectoryLabel=Navedite lokaciju sledeceg diska. + +; *** Installation phase messages +SetupAborted=Instalacija nije kompletna.%n%nIspravite problem i pokrenite instalaciju ponovo. +AbortRetryIgnoreSelectAction=Odaberite radnju +AbortRetryIgnoreRetry=&pokuaj ponovo +AbortRetryIgnoreIgnore=&Ignorii greku i nastavi +AbortRetryIgnoreCancel=Prekini instalaciju + +; *** Installation status messages +StatusClosingApplications=Zatvaram programe... +StatusCreateDirs=Kreiram direktorijume... +StatusExtractFiles=Raspakujem datoteke... +StatusCreateIcons=Kreiram precice... +StatusCreateIniEntries=Kreiram INI unose... +StatusCreateRegistryEntries=Kreiram unose u registar... +StatusRegisterFiles=Registrujem datoteke... +StatusSavingUninstall=Snimam deinstalacione informacije... +StatusRunProgram=Yavravam sa instalacijom... +StatusRestartingApplications=Restartujem program... +StatusRollback=Ponitavam izmjene... + +; *** Misc. errors +ErrorInternal2=Interna greka: %1 +ErrorFunctionFailedNoCode=%1 neuspjeh +ErrorFunctionFailed=%1 neuspjeh; kod %2 +ErrorFunctionFailedWithMessage=%1 neuspjeh; kod %2.%n%3 +ErrorExecutingProgram=Ne mogu da pokrenem datoteku:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Greka pri unosu u registri:%n%1\%2 +ErrorRegCreateKey=Greka pri unosu u registri:%n%1\%2 +ErrorRegWriteKey=Greka pri unosu u registri:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Greka pri stvaranju INI unosa u datoteci "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Izostavite ovu datoteku (ne preporucuje se) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorii greku i nastaviti instalaciju (ne preporucuje se) +SourceIsCorrupted=Instalaciona datoteka je otecena +SourceDoesntExist=Instalaciona datoteka "%1" ne postoji +ExistingFileReadOnly2=Postojeca datoteka ne moe se presnimiti jer je oznacena kao samo za citanje. +ExistingFileReadOnlyRetry=&Uklonite atribut na datoteci samo za citanje i pokuajte ponovo +ExistingFileReadOnlyKeepExisting=&Zadrati postojecu datoteku +ErrorReadingExistingDest=Greka nastala pri citanju vec postojece datoteke: +FileExistsSelectAction=Izaberite operaciju +FileExists2=Datoteka vec postoji. +FileExistsOverwriteExisting=&Presnimite postojecu datoteku +FileExistsKeepExisting=&Zadrati postojecu datoteku +FileExistsOverwriteOrKeepAll=&Uradi ovo kod sledeceg problema +ExistingFileNewerSelectAction=Izaberi operaciju +ExistingFileNewer2=Postojeca datoteka je novija od ove koju elimo da instaliramo. +ExistingFileNewerOverwriteExisting=&Presnimite postojecu datoteku +ExistingFileNewerKeepExisting=&Zadrite postojecu datoteku (preporucujemo) +ExistingFileNewerOverwriteOrKeepAll=&Uradi ovo kod sledeceg problema +ErrorChangingAttr=Greka kod pokuaja da se promijeni atribut datoteke: +ErrorCreatingTemp=Greka kod kreiranja datoteke u navedenom direktorijumu: +ErrorReadingSource=Greka kod pokuaja citanja instalacione datoteke: +ErrorCopying=Greka kod pokuaja snimanja datoteke: +ErrorReplacingExistingFile=Greka kod pokuaja presnimavanja postojece datoteke: +ErrorRestartReplace=Ne mogu da zamijenim: +ErrorRenamingTemp=Dolo je do greke pri pokuaju da preimenujem datoteku u navedenom direktorijumu +ErrorRegisterServer=Ne mogu da registrujem DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 nije uspio. Greka %1 +ErrorRegisterTypeLib=Ne mogu da upiem biblioteku tipova: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Svi korisnici +UninstallDisplayNameMarkCurrentUser=Trenutni korisnik + +; *** Post-installation errors +ErrorOpeningReadme=Greka pri otvaranju tekstualne datoteke. +ErrorRestartingComputer=Instalacija ne moe da restartuje racunar. Uradite to sami. + +; *** Uninstaller messages +UninstallNotFound=Datoteka "%1" ne postoji. Ne mogu da deinstaliram. +UninstallOpenError=Datoteka "%1" se ne moe otvoriti. Ne mogu da deinstaliram +UninstallUnsupportedVer=Izvjetaj "%1" nije prepoznat ode ove verzije deinstalacije. Ne mogu da deinstaliram +UninstallUnknownEntry=Nepoznat unos (%1) se pojavio u izvjetaju deinstalacije +ConfirmUninstall=elite li da deinstalirate %1 kao i sve njegove komponente? +UninstallOnlyOnWin64=Ovu instalaciju je moguce deinstalirati samo na 64-bit Windows-u. +OnlyAdminCanUninstall=Ova instalacija se moe deinstalirati samo kao administrator. +UninstallStatusLabel=Sacekajte da se %1 deinstalira sa racunara. +UninstalledAll=%1 je uspjeno deinstaliran. +UninstalledMost=%1 deinstalacija uspjena.%n%nNeki elementi nijesu uklonjeni. Moete ih sami ukloniti. +UninstalledAndNeedsRestart=Da zavrite sa deinstlacijom %1, restartujte va racunar.%n%nelite li restart sada? +UninstallDataCorrupted="%1" datoteka je otecena. Ne mogu da deinstaliram + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Brisati dijeljenu datoteku? +ConfirmDeleteSharedFile2=Sistem je primijetio da sledecu dijeljenu datoteku vie ne koristi nijedan program. elite li da deinstaliram dijeljenu datoteku?%n%nAko je neki program koristio dijeljenu datoteku, moguce je da on vie nece raditi. Ako nijesi siguran izaberi "Ne". Ostavljanje datoteke na vaem racunaru ne moete imati problema. +SharedFileNameLabel=Ime datoteke: +SharedFileLocationLabel=Lokacija: +WizardUninstalling=Status deinstlacije +StatusUninstalling=Deinstaliram %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instaliram %1. +ShutdownBlockReasonUninstallingApp=Deinstaliram %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 verzija %2 +AdditionalIcons=Dodatne precice: +CreateDesktopIcon=Kreiraj precicu na &desktop +CreateQuickLaunchIcon=Kreiraj precicu na paleti za &Brzo pokretanje +ProgramOnTheWeb=%1 na internetu +UninstallProgram=Deinstaliraj %1 +LaunchProgram=Pokreni %1 +AssocFileExtension=&Povei %1 sa datotekom %2 +AssocingFileExtension=Povezujem %1 sa datotekom %2 ... +AutoStartProgramGroupDescription=Pokretanje: +AutoStartProgram=Automatski pokreni %1 +AddonHostProgramNotFound=%1 nije naden u direktorijumu koji ste izabrali.%n%nelite li da nastavim? diff --git a/installer/innosetup/Languages/Norwegian.isl b/installer/innosetup/Languages/Norwegian.isl new file mode 100644 index 000000000..8141d45a8 --- /dev/null +++ b/installer/innosetup/Languages/Norwegian.isl @@ -0,0 +1,378 @@ +; *** Inno Setup version 6.1.0+ Norwegian (bokml) messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Norwegian translation currently maintained by Eivind Bakkestuen +; E-mail: eivind.bakkestuen@gmail.com +; Many thanks to the following people for language improvements and comments: +; +; Harald Habberstad, Frode Weum, Morten Johnsen, +; Tore Ottinsen, Kristian Hyllestad, Thomas Kelso, Jostein Christoffer Andersen +; +; $jrsoftware: issrc/Files/Languages/Norwegian.isl,v 1.15 2007/04/23 15:03:35 josander+ Exp $ + +[LangOptions] +LanguageName=Norsk +LanguageID=$0414 +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Installasjon +SetupWindowTitle=Installere - %1 +UninstallAppTitle=Avinstaller +UninstallAppFullTitle=%1 Avinstallere + +; *** Misc. common +InformationTitle=Informasjon +ConfirmTitle=Bekreft +ErrorTitle=Feil + +; *** SetupLdr messages +SetupLdrStartupMessage=Dette vil installere %1. Vil du fortsette? +LdrCannotCreateTemp=Kan ikke lage midlertidig fil, installasjonen er avbrutt +LdrCannotExecTemp=Kan ikke kjre fil i den midlertidige mappen, installasjonen er avbrutt + +; *** Startup error messages +LastErrorMessage=%1.%n%nFeil %2: %3 +SetupFileMissing=Filen %1 mangler i installasjonskatalogen. Vennligst korriger problemet eller skaff deg en ny kopi av programmet. +SetupFileCorrupt=Installasjonsfilene er delagte. Vennligst skaff deg en ny kopi av programmet. +SetupFileCorruptOrWrongVer=Installasjonsfilene er delagte eller ikke kompatible med dette installasjonsprogrammet. Vennligst korriger problemet eller skaff deg en ny kopi av programmet. +InvalidParameter=Kommandolinjen hadde en ugyldig parameter:%n%n%1 +SetupAlreadyRunning=Dette programmet kjrer allerede. +WindowsVersionNotSupported=Dette programmet sttter ikke Windows-versjonen p denne maskinen. +WindowsServicePackRequired=Dette programmet krever %1 Service Pack %2 eller nyere. +NotOnThisPlatform=Dette programmet kjrer ikke p %1. +OnlyOnThisPlatform=Dette programmet kjrer kun p %1. +OnlyOnTheseArchitectures=Dette programmet kan kun installeres i Windows-versjoner som er beregnet p flgende prossessorarkitekturer:%n%n%1 +WinVersionTooLowError=Dette programmet krever %1 versjon %2 eller nyere. +WinVersionTooHighError=Dette programmet kan ikke installeres p %1 versjon %2 eller nyere. +AdminPrivilegesRequired=Administrator-rettigheter kreves for installere dette programmet. +PowerUserPrivilegesRequired=Du m vre logget inn som administrator eller ha administrator-rettigheter nr du installerer dette programmet. +SetupAppRunningError=Installasjonsprogrammet har funnet ut at %1 kjrer.%n%nVennligst avslutt det n og klikk deretter OK for fortsette, eller Avbryt for avslutte. +UninstallAppRunningError=Avinstallasjonsprogrammet har funnet ut at %1 kjrer.%n%nVennligst avslutt det n og klikk deretter OK for fortsette, eller Avbryt for avslutte. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Velg Installasjon Type +PrivilegesRequiredOverrideInstruction=Installasjons Type +PrivilegesRequiredOverrideText1=%1 kan installeres for alle brukere (krever administrator-rettigheter), eller bare for deg. +PrivilegesRequiredOverrideText2=%1 kan installeres bare for deg, eller for alle brukere (krever administrator-rettigheter). +PrivilegesRequiredOverrideAllUsers=Installer for &alle brukere +PrivilegesRequiredOverrideAllUsersRecommended=Installer for &alle brukere (anbefalt) +PrivilegesRequiredOverrideCurrentUser=Installer bare for &meg +PrivilegesRequiredOverrideCurrentUserRecommended=Installer bare for &meg (anbefalt) + +; *** Misc. errors +ErrorCreatingDir=Installasjonsprogrammet kunne ikke lage mappen "%1" +ErrorTooManyFilesInDir=Kunne ikke lage en fil i mappen "%1" fordi den inneholder for mange filer + +; *** Setup common messages +ExitSetupTitle=Avslutt installasjonen +ExitSetupMessage=Installasjonen er ikke ferdig. Programmet installeres ikke hvis du avslutter n.%n%nDu kan installere programmet igjen senere hvis du vil.%n%nVil du avslutte? +AboutSetupMenuItem=&Om installasjonsprogrammet... +AboutSetupTitle=Om installasjonsprogrammet +AboutSetupMessage=%1 versjon %2%n%3%n%n%1 hjemmeside:%n%4 +AboutSetupNote= +TranslatorNote=Norwegian translation maintained by Eivind Bakkestuen (eivind.bakkestuen@gmail.com) + +; *** Buttons +ButtonBack=< &Tilbake +ButtonNext=&Neste > +ButtonInstall=&Installer +ButtonOK=OK +ButtonCancel=Avbryt +ButtonYes=&Ja +ButtonYesToAll=Ja til &alle +ButtonNo=&Nei +ButtonNoToAll=N&ei til alle +ButtonFinish=&Ferdig +ButtonBrowse=&Bla gjennom... +ButtonWizardBrowse=&Bla gjennom... +ButtonNewFolder=&Lag ny mappe + +; *** "Select Language" dialog messages +SelectLanguageTitle=Velg installasjonssprk +SelectLanguageLabel=Velg sprket som skal brukes under installasjonen. + +; *** Common wizard text +ClickNext=Klikk p Neste for fortsette, eller Avbryt for avslutte installasjonen. +BeveledLabel= +BrowseDialogTitle=Bla etter mappe +BrowseDialogLabel=Velg en mappe fra listen nedenfor, klikk deretter OK. +NewFolderName=Ny mappe + +; *** "Welcome" wizard page +WelcomeLabel1=Velkommen til installasjonsprogrammet for [name]. +WelcomeLabel2=Dette vil installere [name/ver] p din maskin.%n%nDet anbefales at du avslutter alle programmer som kjrer fr du fortsetter. + +; *** "Password" wizard page +WizardPassword=Passord +PasswordLabel1=Denne installasjonen er passordbeskyttet. +PasswordLabel3=Vennligst oppgi ditt passord og klikk p Neste for fortsette. Sm og store bokstaver behandles ulikt. +PasswordEditLabel=&Passord: +IncorrectPassword=Det angitte passordet er feil, vennligst prv igjen. + +; *** "License Agreement" wizard page +WizardLicense=Lisensbetingelser +LicenseLabel=Vennligst les flgende viktig informasjon fr du fortsetter. +LicenseLabel3=Vennligst les flgende lisensbetingelser. Du m godta innholdet i lisensbetingelsene fr du fortsetter med installasjonen. +LicenseAccepted=Jeg &aksepterer lisensbetingelsene +LicenseNotAccepted=Jeg aksepterer &ikke lisensbetingelsene + +; *** "Information" wizard pages +WizardInfoBefore=Informasjon +InfoBeforeLabel=Vennligst les flgende viktige informasjon fr du fortsetter. +InfoBeforeClickLabel=Klikk p Neste nr du er klar til fortsette. +WizardInfoAfter=Informasjon +InfoAfterLabel=Vennligst les flgende viktige informasjon fr du fortsetter. +InfoAfterClickLabel=Klikk p Neste nr du er klar til fortsette. + +; *** "User Information" wizard page +WizardUserInfo=Brukerinformasjon +UserInfoDesc=Vennligst angi informasjon. +UserInfoName=&Brukernavn: +UserInfoOrg=&Organisasjon: +UserInfoSerial=&Serienummer: +UserInfoNameRequired=Du m angi et navn. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Velg mappen hvor filene skal installeres: +SelectDirDesc=Hvor skal [name] installeres? +SelectDirLabel3=Installasjonsprogrammet vil installere [name] i flgende mappe. +SelectDirBrowseLabel=Klikk p Neste for fortsette. Klikk p Bla gjennom hvis du vil velge en annen mappe. +DiskSpaceGBLabel=Programmet krever minst [gb] GB med diskplass. +DiskSpaceMBLabel=Programmet krever minst [mb] MB med diskplass. +CannotInstallToNetworkDrive=Kan ikke installere p en nettverksstasjon. +CannotInstallToUNCPath=Kan ikke installere p en UNC-bane. Du m tilordne nettverksstasjonen hvis du vil installere i et nettverk. +InvalidPath=Du m angi en full bane med stasjonsbokstav, for eksempel:%n%nC:\APP%n%Du kan ikke bruke formen:%n%n\\server\share +InvalidDrive=Den valgte stasjonen eller UNC-delingen finnes ikke, eller er ikke tilgjengelig. Vennligst velg en annen +DiskSpaceWarningTitle=For lite diskplass +DiskSpaceWarning=Installasjonprogrammet krever minst %1 KB med ledig diskplass, men det er bare %2 KB ledig p den valgte stasjonen.%n%nvil du fortsette likevel? +DirNameTooLong=Det er for langt navn p mappen eller banen. +InvalidDirName=Navnet p mappen er ugyldig. +BadDirName32=Mappenavn m ikke inneholde noen av flgende tegn:%n%n%1 +DirExistsTitle=Eksisterende mappe +DirExists=Mappen:%n%n%1%n%nfinnes allerede. Vil du likevel installere der? +DirDoesntExistTitle=Mappen eksisterer ikke +DirDoesntExist=Mappen:%n%n%1%n%nfinnes ikke. Vil du at den skal lages? + +; *** "Select Components" wizard page +WizardSelectComponents=Velg komponenter +SelectComponentsDesc=Hvilke komponenter skal installeres? +SelectComponentsLabel2=Velg komponentene du vil installere; velg bort de komponentene du ikke vil installere. Nr du er klar, klikker du p Neste for fortsette. +FullInstallation=Full installasjon +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompakt installasjon +CustomInstallation=Egendefinert installasjon +NoUninstallWarningTitle=Komponenter eksisterer +NoUninstallWarning=Installasjonsprogrammet har funnet ut at flgende komponenter allerede er p din maskin:%n%n%1%n%nDisse komponentene avinstalleres ikke selv om du ikke velger dem.%n%nVil du likevel fortsette? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Valgte alternativer krever minst [gb] GB med diskplass. +ComponentsDiskSpaceMBLabel=Valgte alternativer krever minst [mb] MB med diskplass. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Velg tilleggsoppgaver +SelectTasksDesc=Hvilke tilleggsoppgaver skal utfres? +SelectTasksLabel2=Velg tilleggsoppgavene som skal utfres mens [name] installeres, klikk deretter p Neste. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Velg mappe p start-menyen +SelectStartMenuFolderDesc=Hvor skal installasjonsprogrammet plassere snarveiene? +SelectStartMenuFolderLabel3=Installasjonsprogrammet vil opprette snarveier p flgende startmeny-mappe. +SelectStartMenuFolderBrowseLabel=Klikk p Neste for fortsette. Klikk p Bla igjennom hvis du vil velge en annen mappe. +MustEnterGroupName=Du m skrive inn et mappenavn. +GroupNameTooLong=Det er for langt navn p mappen eller banen. +InvalidGroupName=Navnet p mappen er ugyldig. +BadGroupName=Mappenavnet m ikke inneholde flgende tegn:%n%n%1 +NoProgramGroupCheck2=&Ikke legg til mappe p start-menyen + +; *** "Ready to Install" wizard page +WizardReady=Klar til installere +ReadyLabel1=Installasjonsprogrammet er n klar til installere [name] p din maskin. +ReadyLabel2a=Klikk Installer for fortsette, eller Tilbake for se p eller forandre instillingene. +ReadyLabel2b=Klikk Installer for fortsette. +ReadyMemoUserInfo=Brukerinformasjon: +ReadyMemoDir=Installer i mappen: +ReadyMemoType=Installasjonstype: +ReadyMemoComponents=Valgte komponenter: +ReadyMemoGroup=Programgruppe: +ReadyMemoTasks=Tilleggsoppgaver: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Laster ned ekstra filer... +ButtonStopDownload=&Stopp nedlasting +StopDownload=Er du sikker p at du vil stoppe nedlastingen? +ErrorDownloadAborted=Nedlasting avbrutt +ErrorDownloadFailed=Nedlasting feilet: %1 %2 +ErrorDownloadSizeFailed=Kunne ikke finne filstrrelse: %1 %2 +ErrorFileHash1=Fil hash verdi feilet: %1 +ErrorFileHash2=Ugyldig fil hash verdi: forventet %1, fant %2 +ErrorProgress=Ugyldig fremdrift: %1 of %2 +ErrorFileSize=Ugyldig fil strrelse: forventet %1, fant %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Forbereder installasjonen +PreparingDesc=Installasjonsprogrammet forbereder installasjon av [name] p den maskin. +PreviousInstallNotCompleted=Installasjonen/fjerningen av et tidligere program ble ikke ferdig. Du m starte maskinen p nytt.%n%nEtter omstarten m du kjre installasjonsprogrammet p nytt for fullfre installasjonen av [name]. +CannotContinue=Installasjonsprogrammet kan ikke fortsette. Klikk p Avbryt for avslutte. +ApplicationsFound=Disse applikasjonene bruker filer som vil oppdateres av installasjonen. Det anbefales la installasjonen automatisk avslutte disse applikasjonene. +ApplicationsFound2=Disse applikasjonene bruker filer som vil oppdateres av installasjonen. Det anbefales la installasjonen automatisk avslutte disse applikasjonene. Installasjonen vil prve starte applikasjonene p nytt etter at installasjonen er avsluttet. +CloseApplications=Lukk applikasjonene &automatisk +DontCloseApplications=&Ikke lukk applikasjonene +ErrorCloseApplications=Installasjonsprogrammet kunne ikke lukke alle applikasjonene &automatisk. Det anbefales lukke alle applikasjoner som bruker filer som installasjonsprogrammet trenger oppdatere fr du fortsetter installasjonen. +PrepareToInstallNeedsRestart=Installasjonsprogrammet m gjre omstart av maskinen. Etter omstart av maskinen, kjr installasjonsprogrammet p nytt for ferdigstille installasjonen av [name].%n%nVil du gjre omstart av maskinen n? + +; *** "Installing" wizard page +WizardInstalling=Installerer +InstallingLabel=Vennligst vent mens [name] installeres p din maskin. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Fullfrer installasjonsprogrammet for [name] +FinishedLabelNoIcons=[name] er installert p din maskin. +FinishedLabel=[name] er installert p din maskin. Programmet kan kjres ved at du klikker p ett av de installerte ikonene. +ClickFinish=Klikk Ferdig for avslutte installasjonen. +FinishedRestartLabel=Maskinen m startes p nytt for at installasjonen skal fullfres. Vil du starte p nytt n? +FinishedRestartMessage=Maskinen m startes p nytt for at installasjonen skal fullfres.%n%nVil du starte p nytt n? +ShowReadmeCheck=Ja, jeg vil se p LESMEG-filen +YesRadio=&Ja, start maskinen p nytt n +NoRadio=&Nei, jeg vil starte maskinen p nytt senere +; used for example as 'Run MyProg.exe' +RunEntryExec=Kjr %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Se p %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Trenger neste diskett +SelectDiskLabel2=Vennligst sett inn diskett %1 og klikk OK.%n%nHvis filene p finnes et annet sted enn det som er angitt nedenfor, kan du skrive inn korrekt bane eller klikke p Bla Gjennom. +PathLabel=&Bane: +FileNotInDir2=Finner ikke filen "%1" i "%2". Vennligst sett inn riktig diskett eller velg en annen mappe. +SelectDirectoryLabel=Vennligst angi hvor den neste disketten er. + +; *** Installation phase messages +SetupAborted=Installasjonen ble avbrutt.%n%nVennligst korriger problemet og prv igjen. +AbortRetryIgnoreSelectAction=Velg aksjon +AbortRetryIgnoreRetry=&Prv Igjen +AbortRetryIgnoreIgnore=&Ignorer feil og fortsett +AbortRetryIgnoreCancel=Cancel installation + +; *** Installation status messages +StatusClosingApplications=Lukker applikasjoner... +StatusCreateDirs=Lager mapper... +StatusExtractFiles=Pakker ut filer... +StatusCreateIcons=Lager programikoner... +StatusCreateIniEntries=Lager INI-instillinger... +StatusCreateRegistryEntries=Lager innstillinger i registeret... +StatusRegisterFiles=Registrerer filer... +StatusSavingUninstall=Lagrer info for avinstallering... +StatusRunProgram=Gjr ferdig installasjonen... +StatusRestartingApplications=Restarter applikasjoner... +StatusRollback=Tilbakestiller forandringer... + +; *** Misc. errors +ErrorInternal2=Intern feil %1 +ErrorFunctionFailedNoCode=%1 gikk galt +ErrorFunctionFailed=%1 gikk galt; kode %2 +ErrorFunctionFailedWithMessage=%1 gikk galt; kode %2.%n%3 +ErrorExecutingProgram=Kan ikke kjre filen:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Feil under pning av registernkkel:%n%1\%2 +ErrorRegCreateKey=Feil under laging av registernkkel:%n%1\%2 +ErrorRegWriteKey=Feil under skriving til registernkkel:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Feil under laging av innstilling i filen "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Hopp over denne filen (ikke anbefalt) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorer feilen og fortsett (ikke anbefalt) +SourceIsCorrupted=Kildefilen er delagt +SourceDoesntExist=Kildefilen "%1" finnes ikke +ExistingFileReadOnly2=Den eksisterende filen er skrivebeskyttet og kan ikke erstattes. +ExistingFileReadOnlyRetry=&Fjern skrivebeskyttelse og prv igjen +ExistingFileReadOnlyKeepExisting=&Behold eksisterende fil +ErrorReadingExistingDest=En feil oppsto under lesing av den eksisterende filen: +FileExistsSelectAction=Velg aksjon +FileExists2=Filen eksisterer allerede. +FileExistsOverwriteExisting=&Overskriv den eksisterende filen +FileExistsKeepExisting=&Behold den eksisterende filen +FileExistsOverwriteOrKeepAll=&Gjr samme valg for pflgende konflikter +ExistingFileNewerSelectAction=Velg aksjon +ExistingFileNewer2=Den eksisterende filen er nyere enn filen Installasjonen prver installere. +ExistingFileNewerOverwriteExisting=&Overskriv den eksisterende filen +ExistingFileNewerKeepExisting=&Behold den eksisterende filen (anbefalt) +ExistingFileNewerOverwriteOrKeepAll=&Gjr samme valg for pflgende konflikter +ErrorChangingAttr=En feil oppsto da attributtene ble forskt forandret p den eksisterende filen: +ErrorCreatingTemp=En feil oppsto under forsket p lage en fil i ml-mappen: +ErrorReadingSource=En feil oppsto under forsket p lese kildefilen: +ErrorCopying=En feil oppsto under forsk p kopiere en fil: +ErrorReplacingExistingFile=En feil oppsto under forsket p erstatte den eksisterende filen: +ErrorRestartReplace=RestartReplace gikk galt: +ErrorRenamingTemp=En feil oppsto under omdping av fil i ml-mappen: +ErrorRegisterServer=Kan ikke registrere DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 gikk galt med avslutte kode %1 +ErrorRegisterTypeLib=Kan ikke registrere typebiblioteket: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Alle brukere +UninstallDisplayNameMarkCurrentUser=Aktiv bruker + +; *** Post-installation errors +ErrorOpeningReadme=En feil oppsto under forsket p pne LESMEG-filen. +ErrorRestartingComputer=Installasjonsprogrammet kunne ikke starte maskinen p nytt. Vennligst gjr dette manuelt. + +; *** Uninstaller messages +UninstallNotFound=Filen "%1" finnes ikke. Kan ikke avinstallere. +UninstallOpenError=Filen "%1" kunne ikke pnes. Kan ikke avinstallere. +UninstallUnsupportedVer=Kan ikke avinstallere. Avinstallasjons-loggfilen "%1" har et format som ikke gjenkjennes av denne versjonen av avinstallasjons-programmet +UninstallUnknownEntry=Et ukjent parameter (%1) ble funnet i Avinstallasjons-loggfilen +ConfirmUninstall=Er du sikker p at du helt vil fjerne %1 og alle tilhrende komponenter? +UninstallOnlyOnWin64=Denne installasjonen kan bare ufres p 64-bit Windows. +OnlyAdminCanUninstall=Denne installasjonen kan bare avinstalleres av en bruker med Administrator-rettigheter. +UninstallStatusLabel=Vennligst vent mens %1 fjernes fra maskinen. +UninstalledAll=Avinstallasjonen av %1 var vellykket +UninstalledMost=Avinstallasjonen av %1 er ferdig.%n%nEnkelte elementer kunne ikke fjernes. Disse kan fjernes manuelt. +UninstalledAndNeedsRestart=Du m starte maskinen p nytt for fullfre installasjonen av %1.%n%nVil du starte p nytt n? +UninstallDataCorrupted="%1"-filen er delagt. Kan ikke avinstallere. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Fjerne delte filer? +ConfirmDeleteSharedFile2=Systemet indikerer at den flgende filen ikke lengre brukes av andre programmer. Vil du at avinstalleringsprogrammet skal fjerne den delte filen?%n%nHvis andre programmer bruker denne filen, kan du risikere at de ikke lengre vil virke som de skal. Velg Nei hvis du er usikker. Det vil ikke gjre noen skade hvis denne filen ligger p din maskin. +SharedFileNameLabel=Filnavn: +SharedFileLocationLabel=Plassering: +WizardUninstalling=Avinstallerings-status: +StatusUninstalling=Avinstallerer %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Installerer %1. +ShutdownBlockReasonUninstallingApp=Avinstallerer %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versjon %2 +AdditionalIcons=Ekstra-ikoner: +CreateDesktopIcon=Lag ikon p &skrivebordet +CreateQuickLaunchIcon=Lag et &Hurtigstarts-ikon +ProgramOnTheWeb=%1 p nettet +UninstallProgram=Avinstaller %1 +LaunchProgram=Kjr %1 +AssocFileExtension=&Koble %1 med filetternavnet %2 +AssocingFileExtension=Kobler %1 med filetternavnet %2... +AutoStartProgramGroupDescription=Oppstart: +AutoStartProgram=Start %1 automatisk +AddonHostProgramNotFound=%1 ble ikke funnet i katalogen du valgte.%n%nVil du fortsette likevel? \ No newline at end of file diff --git a/installer/innosetup/Languages/Polish.isl b/installer/innosetup/Languages/Polish.isl new file mode 100644 index 000000000..b10281425 --- /dev/null +++ b/installer/innosetup/Languages/Polish.isl @@ -0,0 +1,377 @@ +; *** Inno Setup version 6.1.0+ Polish messages *** +; Krzysztof Cynarski +; Proofreading, corrections and 5.5.7-6.1.0+ updates: +; ukasz Abramczuk +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; last update: 2020/07/26 + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Polski +LanguageID=$0415 +LanguageCodePage=1250 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalator +SetupWindowTitle=Instalacja - %1 +UninstallAppTitle=Dezinstalator +UninstallAppFullTitle=Dezinstalacja - %1 + +; *** Misc. common +InformationTitle=Informacja +ConfirmTitle=Potwierd +ErrorTitle=Bd + +; *** SetupLdr messages +SetupLdrStartupMessage=Ten program zainstaluje aplikacj %1. Czy chcesz kontynuowa? +LdrCannotCreateTemp=Nie mona utworzy pliku tymczasowego. Instalacja przerwana +LdrCannotExecTemp=Nie mona uruchomi pliku z folderu tymczasowego. Instalacja przerwana +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nBd %2: %3 +SetupFileMissing=W folderze instalacyjnym brakuje pliku %1.%nProsz o przywrcenie brakujcych plikw lub uzyskanie nowej kopii programu instalacyjnego. +SetupFileCorrupt=Pliki instalacyjne s uszkodzone. Zaleca si uzyskanie nowej kopii programu instalacyjnego. +SetupFileCorruptOrWrongVer=Pliki instalacyjne s uszkodzone lub niezgodne z t wersj instalatora. Prosz rozwiza problem lub uzyska now kopi programu instalacyjnego. +InvalidParameter=W linii komend przekazano nieprawidowy parametr:%n%n%1 +SetupAlreadyRunning=Instalator jest ju uruchomiony. +WindowsVersionNotSupported=Ta aplikacja nie wspiera aktualnie uruchomionej wersji Windows. +WindowsServicePackRequired=Ta aplikacja wymaga systemu %1 z dodatkiem Service Pack %2 lub nowszym. +NotOnThisPlatform=Tej aplikacji nie mona uruchomi w systemie %1. +OnlyOnThisPlatform=Ta aplikacja wymaga systemu %1. +OnlyOnTheseArchitectures=Ta aplikacja moe by uruchomiona tylko w systemie Windows zaprojektowanym dla procesorw o architekturze:%n%n%1 +WinVersionTooLowError=Ta aplikacja wymaga systemu %1 w wersji %2 lub nowszej. +WinVersionTooHighError=Ta aplikacja nie moe by zainstalowana w systemie %1 w wersji %2 lub nowszej. +AdminPrivilegesRequired=Aby przeprowadzi instalacj tej aplikacji, konto uytkownika systemu musi posiada uprawnienia administratora. +PowerUserPrivilegesRequired=Aby przeprowadzi instalacj tej aplikacji, konto uytkownika systemu musi posiada uprawnienia administratora lub uytkownika zaawansowanego. +SetupAppRunningError=Instalator wykry, i aplikacja %1 jest aktualnie uruchomiona.%n%nPrzed wciniciem przycisku OK zamknij wszystkie procesy aplikacji. Kliknij przycisk Anuluj, aby przerwa instalacj. +UninstallAppRunningError=Dezinstalator wykry, i aplikacja %1 jest aktualnie uruchomiona.%n%nPrzed wciniciem przycisku OK zamknij wszystkie procesy aplikacji. Kliknij przycisk Anuluj, aby przerwa dezinstalacj. + +; *** Startup questions --- +PrivilegesRequiredOverrideTitle=Wybierz typ instalacji aplikacji +PrivilegesRequiredOverrideInstruction=Wybierz typ instalacji +PrivilegesRequiredOverrideText1=Aplikacja %1 moe zosta zainstalowana dla wszystkich uytkownikw (wymagane s uprawnienia administratora) lub tylko dla biecego uytkownika. +PrivilegesRequiredOverrideText2=Aplikacja %1 moe zosta zainstalowana dla biecego uytkownika lub wszystkich uytkownikw (wymagane s uprawnienia administratora). +PrivilegesRequiredOverrideAllUsers=Zainstaluj dla &wszystkich uytkownikw +PrivilegesRequiredOverrideAllUsersRecommended=Zainstaluj dla &wszystkich uytkownikw (zalecane) +PrivilegesRequiredOverrideCurrentUser=Zainstaluj dla &biecego uytkownika +PrivilegesRequiredOverrideCurrentUserRecommended=Zainstaluj dla &biecego uytkownika (zalecane) + +; *** Misc. errors +ErrorCreatingDir=Instalator nie mg utworzy katalogu "%1" +ErrorTooManyFilesInDir=Nie mona utworzy pliku w katalogu "%1", poniewa zawiera on zbyt wiele plikw + +; *** Setup common messages +ExitSetupTitle=Zakocz instalacj +ExitSetupMessage=Instalacja nie zostaa zakoczona. Jeeli przerwiesz j teraz, aplikacja nie zostanie zainstalowana. Mona ponowi instalacj pniej poprzez uruchamianie instalatora.%n%nCzy chcesz przerwa instalacj? +AboutSetupMenuItem=&O instalatorze... +AboutSetupTitle=O instalatorze +AboutSetupMessage=%1 wersja %2%n%3%n%n Strona domowa %1:%n%4 +AboutSetupNote= +TranslatorNote=Wersja polska: Krzysztof Cynarski%n%nOd wersji 5.5.7: ukasz Abramczuk%n + +; *** Buttons +ButtonBack=< &Wstecz +ButtonNext=&Dalej > +ButtonInstall=&Instaluj +ButtonOK=OK +ButtonCancel=Anuluj +ButtonYes=&Tak +ButtonYesToAll=Tak na &wszystkie +ButtonNo=&Nie +ButtonNoToAll=N&ie na wszystkie +ButtonFinish=&Zakocz +ButtonBrowse=&Przegldaj... +ButtonWizardBrowse=P&rzegldaj... +ButtonNewFolder=&Utwrz nowy folder + +; *** "Select Language" dialog messages +SelectLanguageTitle=Jzyk instalacji +SelectLanguageLabel=Wybierz jzyk uywany podczas instalacji: + +; *** Common wizard text +ClickNext=Kliknij przycisk Dalej, aby kontynuowa, lub Anuluj, aby zakoczy instalacj. +BeveledLabel= +BrowseDialogTitle=Wska folder +BrowseDialogLabel=Wybierz folder z poniszej listy, a nastpnie kliknij przycisk OK. +NewFolderName=Nowy folder + +; *** "Welcome" wizard page +WelcomeLabel1=Witamy w instalatorze aplikacji [name] +WelcomeLabel2=Aplikacja [name/ver] zostanie teraz zainstalowana na komputerze.%n%nZalecane jest zamknicie wszystkich innych uruchomionych programw przed rozpoczciem procesu instalacji. + +; *** "Password" wizard page +WizardPassword=Haso +PasswordLabel1=Ta instalacja jest zabezpieczona hasem. +PasswordLabel3=Podaj haso, a nastpnie kliknij przycisk Dalej, aby kontynuowa. W hasach rozrniane s wielkie i mae litery. +PasswordEditLabel=&Haso: +IncorrectPassword=Wprowadzone haso jest nieprawidowe. Sprbuj ponownie. + +; *** "License Agreement" wizard page +WizardLicense=Umowa Licencyjna +LicenseLabel=Przed kontynuacj naley zapozna si z ponisz wan informacj. +LicenseLabel3=Prosz przeczyta tekst Umowy Licencyjnej. Przed kontynuacj instalacji naley zaakceptowa warunki umowy. +LicenseAccepted=&Akceptuj warunki umowy +LicenseNotAccepted=&Nie akceptuj warunkw umowy + +; *** "Information" wizard pages +WizardInfoBefore=Informacja +InfoBeforeLabel=Przed kontynuacj naley zapozna si z ponisz informacj. +InfoBeforeClickLabel=Kiedy bdziesz gotowy do instalacji, kliknij przycisk Dalej. +WizardInfoAfter=Informacja +InfoAfterLabel=Przed kontynuacj naley zapozna si z ponisz informacj. +InfoAfterClickLabel=Gdy bdziesz gotowy do zakoczenia instalacji, kliknij przycisk Dalej. + +; *** "User Information" wizard page +WizardUserInfo=Dane uytkownika +UserInfoDesc=Prosz poda swoje dane. +UserInfoName=Nazwa &uytkownika: +UserInfoOrg=&Organizacja: +UserInfoSerial=Numer &seryjny: +UserInfoNameRequired=Nazwa uytkownika jest wymagana. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Lokalizacja docelowa +SelectDirDesc=Gdzie ma zosta zainstalowana aplikacja [name]? +SelectDirLabel3=Instalator zainstaluje aplikacj [name] do wskazanego poniej folderu. +SelectDirBrowseLabel=Kliknij przycisk Dalej, aby kontynuowa. Jeli chcesz wskaza inny folder, kliknij przycisk Przegldaj. +DiskSpaceGBLabel=Instalacja wymaga przynajmniej [gb] GB wolnego miejsca na dysku. +DiskSpaceMBLabel=Instalacja wymaga przynajmniej [mb] MB wolnego miejsca na dysku. +CannotInstallToNetworkDrive=Instalator nie moe zainstalowa aplikacji na dysku sieciowym. +CannotInstallToUNCPath=Instalator nie moe zainstalowa aplikacji w ciece UNC. +InvalidPath=Naley wprowadzi pen ciek wraz z liter dysku, np.:%n%nC:\PROGRAM%n%nlub ciek sieciow (UNC) w formacie:%n%n\\serwer\udzia +InvalidDrive=Wybrany dysk lub udostpniony folder sieciowy nie istnieje. Prosz wybra inny. +DiskSpaceWarningTitle=Niewystarczajca ilo wolnego miejsca na dysku +DiskSpaceWarning=Instalator wymaga co najmniej %1 KB wolnego miejsca na dysku. Wybrany dysk posiada tylko %2 KB dostpnego miejsca.%n%nCzy mimo to chcesz kontynuowa? +DirNameTooLong=Nazwa folderu lub cieki jest za duga. +InvalidDirName=Niepoprawna nazwa folderu. +BadDirName32=Nazwa folderu nie moe zawiera adnego z nastpujcych znakw:%n%n%1 +DirExistsTitle=Folder ju istnieje +DirExists=Poniszy folder ju istnieje:%n%n%1%n%nCzy mimo to chcesz zainstalowa aplikacj w tym folderze? +DirDoesntExistTitle=Folder nie istnieje +DirDoesntExist=Poniszy folder nie istnieje:%n%n%1%n%nCzy chcesz, aby zosta utworzony? + +; *** "Select Components" wizard page +WizardSelectComponents=Komponenty instalacji +SelectComponentsDesc=Ktre komponenty maj zosta zainstalowane? +SelectComponentsLabel2=Zaznacz komponenty, ktre chcesz zainstalowa i odznacz te, ktrych nie chcesz zainstalowa. Kliknij przycisk Dalej, aby kontynuowa. +FullInstallation=Instalacja pena +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Instalacja podstawowa +CustomInstallation=Instalacja uytkownika +NoUninstallWarningTitle=Zainstalowane komponenty +NoUninstallWarning=Instalator wykry, e na komputerze s ju zainstalowane nastpujce komponenty:%n%n%1%n%nOdznaczenie ktregokolwiek z nich nie spowoduje ich dezinstalacji.%n%nCzy pomimo tego chcesz kontynuowa? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Wybrane komponenty wymagaj co najmniej [gb] GB na dysku. +ComponentsDiskSpaceMBLabel=Wybrane komponenty wymagaj co najmniej [mb] MB na dysku. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Zadania dodatkowe +SelectTasksDesc=Ktre zadania dodatkowe maj zosta wykonane? +SelectTasksLabel2=Zaznacz dodatkowe zadania, ktre instalator ma wykona podczas instalacji aplikacji [name], a nastpnie kliknij przycisk Dalej, aby kontynuowa. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Folder Menu Start +SelectStartMenuFolderDesc=Gdzie maj zosta umieszczone skrty do aplikacji? +SelectStartMenuFolderLabel3=Instalator utworzy skrty do aplikacji we wskazanym poniej folderze Menu Start. +SelectStartMenuFolderBrowseLabel=Kliknij przycisk Dalej, aby kontynuowa. Jeli chcesz wskaza inny folder, kliknij przycisk Przegldaj. +MustEnterGroupName=Musisz wprowadzi nazw folderu. +GroupNameTooLong=Nazwa folderu lub cieki jest za duga. +InvalidGroupName=Niepoprawna nazwa folderu. +BadGroupName=Nazwa folderu nie moe zawiera adnego z nastpujcych znakw:%n%n%1 +NoProgramGroupCheck2=&Nie twrz folderu w Menu Start + +; *** "Ready to Install" wizard page +WizardReady=Gotowy do rozpoczcia instalacji +ReadyLabel1=Instalator jest ju gotowy do rozpoczcia instalacji aplikacji [name] na komputerze. +ReadyLabel2a=Kliknij przycisk Instaluj, aby rozpocz instalacj lub Wstecz, jeli chcesz przejrze lub zmieni ustawienia. +ReadyLabel2b=Kliknij przycisk Instaluj, aby kontynuowa instalacj. +ReadyMemoUserInfo=Dane uytkownika: +ReadyMemoDir=Lokalizacja docelowa: +ReadyMemoType=Rodzaj instalacji: +ReadyMemoComponents=Wybrane komponenty: +ReadyMemoGroup=Folder w Menu Start: +ReadyMemoTasks=Dodatkowe zadania: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Pobieranie dodatkowych plikw... +ButtonStopDownload=&Zatrzymaj pobieranie +StopDownload=Czy na pewno chcesz zatrzyma pobieranie? +ErrorDownloadAborted=Pobieranie przerwane +ErrorDownloadFailed=Bd pobierania: %1 %2 +ErrorDownloadSizeFailed=Pobieranie informacji o rozmiarze nie powiodo si: %1 %2 +ErrorFileHash1=Bd sumy kontrolnej pliku: %1 +ErrorFileHash2=Nieprawidowa suma kontrolna pliku: oczekiwano %1, otrzymano %2 +ErrorProgress=Nieprawidowy postp: %1 z %2 +ErrorFileSize=Nieprawidowy rozmiar pliku: oczekiwano %1, otrzymano %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Przygotowanie do instalacji +PreparingDesc=Instalator przygotowuje instalacj aplikacji [name] na komputerze. +PreviousInstallNotCompleted=Instalacja/dezinstalacja poprzedniej wersji aplikacji nie zostaa zakoczona. Aby zakoczy instalacj, naley ponownie uruchomi komputer. %n%nNastpnie ponownie uruchom instalator, aby zakoczy instalacj aplikacji [name]. +CannotContinue=Instalator nie moe kontynuowa. Kliknij przycisk Anuluj, aby przerwa instalacj. +ApplicationsFound=Ponisze aplikacje uywaj plikw, ktre musz zosta uaktualnione przez instalator. Zaleca si zezwoli na automatyczne zamknicie tych aplikacji przez program instalacyjny. +ApplicationsFound2=Ponisze aplikacje uywaj plikw, ktre musz zosta uaktualnione przez instalator. Zaleca si zezwoli na automatyczne zamknicie tych aplikacji przez program instalacyjny. Po zakoczonej instalacji instalator podejmie prb ich ponownego uruchomienia. +CloseApplications=&Automatycznie zamknij aplikacje +DontCloseApplications=&Nie zamykaj aplikacji +ErrorCloseApplications=Instalator nie by w stanie automatycznie zamkn wymaganych aplikacji. Zalecane jest zamknicie wszystkich aplikacji, ktre aktualnie uywaj uaktualnianych przez program instalacyjny plikw. +PrepareToInstallNeedsRestart=Instalator wymaga ponownego uruchomienia komputera. Po restarcie komputera uruchom instalator ponownie, by dokoczy proces instalacji aplikacji [name].%n%nCzy chcesz teraz uruchomi komputer ponownie? + +; *** "Installing" wizard page +WizardInstalling=Instalacja +InstallingLabel=Poczekaj, a instalator zainstaluje aplikacj [name] na komputerze. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Zakoczono instalacj aplikacji [name] +FinishedLabelNoIcons=Instalator zakoczy instalacj aplikacji [name] na komputerze. +FinishedLabel=Instalator zakoczy instalacj aplikacji [name] na komputerze. Aplikacja moe by uruchomiona poprzez uycie zainstalowanych skrtw. +ClickFinish=Kliknij przycisk Zakocz, aby zakoczy instalacj. +FinishedRestartLabel=Aby zakoczy instalacj aplikacji [name], instalator musi ponownie uruchomi komputer. Czy chcesz teraz uruchomi komputer ponownie? +FinishedRestartMessage=Aby zakoczy instalacj aplikacji [name], instalator musi ponownie uruchomi komputer.%n%nCzy chcesz teraz uruchomi komputer ponownie? +ShowReadmeCheck=Tak, chc przeczyta dodatkowe informacje +YesRadio=&Tak, uruchom ponownie teraz +NoRadio=&Nie, uruchomi ponownie pniej +; used for example as 'Run MyProg.exe' +RunEntryExec=Uruchom aplikacj %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Wywietl plik %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Instalator potrzebuje kolejnego archiwum +SelectDiskLabel2=Prosz woy dysk %1 i klikn przycisk OK.%n%nJeli wymieniony poniej folder nie okrela pooenia plikw z tego dysku, prosz wprowadzi poprawn ciek lub klikn przycisk Przegldaj. +PathLabel=&cieka: +FileNotInDir2=cieka "%2" nie zawiera pliku "%1". Prosz woy waciwy dysk lub wybra inny folder. +SelectDirectoryLabel=Prosz okreli lokalizacj kolejnego archiwum instalatora. + +; *** Installation phase messages +SetupAborted=Instalacja nie zostaa zakoczona.%n%nProsz rozwiza problem i ponownie rozpocz instalacj. +AbortRetryIgnoreSelectAction=Wybierz operacj +AbortRetryIgnoreRetry=Sprbuj &ponownie +AbortRetryIgnoreIgnore=Z&ignoruj bd i kontynuuj +AbortRetryIgnoreCancel=Przerwij instalacj + +; *** Installation status messages +StatusClosingApplications=Zamykanie aplikacji... +StatusCreateDirs=Tworzenie folderw... +StatusExtractFiles=Dekompresja plikw... +StatusCreateIcons=Tworzenie skrtw aplikacji... +StatusCreateIniEntries=Tworzenie zapisw w plikach INI... +StatusCreateRegistryEntries=Tworzenie zapisw w rejestrze... +StatusRegisterFiles=Rejestracja plikw... +StatusSavingUninstall=Zapisywanie informacji o dezinstalacji... +StatusRunProgram=Koczenie instalacji... +StatusRestartingApplications=Ponowne uruchamianie aplikacji... +StatusRollback=Cofanie zmian... + +; *** Misc. errors +ErrorInternal2=Wewntrzny bd: %1 +ErrorFunctionFailedNoCode=Bd podczas wykonywania %1 +ErrorFunctionFailed=Bd podczas wykonywania %1; kod %2 +ErrorFunctionFailedWithMessage=Bd podczas wykonywania %1; kod %2.%n%3 +ErrorExecutingProgram=Nie mona uruchomi:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Bd podczas otwierania klucza rejestru:%n%1\%2 +ErrorRegCreateKey=Bd podczas tworzenia klucza rejestru:%n%1\%2 +ErrorRegWriteKey=Bd podczas zapisu do klucza rejestru:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Bd podczas tworzenia pozycji w pliku INI: "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Pomi plik (niezalecane) +FileAbortRetryIgnoreIgnoreNotRecommended=Z&ignoruj bd i kontynuuj (niezalecane) +SourceIsCorrupted=Plik rdowy jest uszkodzony +SourceDoesntExist=Plik rdowy "%1" nie istnieje +ExistingFileReadOnly2=Istniejcy plik nie moe zosta zastpiony, gdy jest oznaczony jako "Tylko do odczytu". +ExistingFileReadOnlyRetry=&Usu atrybut "Tylko do odczytu" i sprbuj ponownie +ExistingFileReadOnlyKeepExisting=&Zachowaj istniejcy plik +ErrorReadingExistingDest=Wystpi bd podczas prby odczytu istniejcego pliku: +FileExistsSelectAction=Wybierz czynno +FileExists2=Plik ju istnieje. +FileExistsOverwriteExisting=&Nadpisz istniejcy plik +FileExistsKeepExisting=&Zachowaj istniejcy plik +FileExistsOverwriteOrKeepAll=&Wykonaj t czynno dla kolejnych przypadkw +ExistingFileNewerSelectAction=Wybierz czynno +ExistingFileNewer2=Istniejcy plik jest nowszy ni ten, ktry instalator prbuje skopiowa. +ExistingFileNewerOverwriteExisting=&Nadpisz istniejcy plik +ExistingFileNewerKeepExisting=&Zachowaj istniejcy plik (zalecane) +ExistingFileNewerOverwriteOrKeepAll=&Wykonaj t czynno dla kolejnych przypadkw +ErrorChangingAttr=Wystpi bd podczas prby zmiany atrybutw pliku docelowego: +ErrorCreatingTemp=Wystpi bd podczas prby utworzenia pliku w folderze docelowym: +ErrorReadingSource=Wystpi bd podczas prby odczytu pliku rdowego: +ErrorCopying=Wystpi bd podczas prby kopiowania pliku: +ErrorReplacingExistingFile=Wystpi bd podczas prby zamiany istniejcego pliku: +ErrorRestartReplace=Prba zastpienia plikw przy ponownym uruchomieniu komputera nie powioda si. +ErrorRenamingTemp=Wystpi bd podczas prby zmiany nazwy pliku w folderze docelowym: +ErrorRegisterServer=Nie mona zarejestrowa DLL/OCX: %1 +ErrorRegSvr32Failed=Funkcja RegSvr32 zakoczya si z kodem bdu %1 +ErrorRegisterTypeLib=Nie mog zarejestrowa biblioteki typw: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=wersja 32-bitowa +UninstallDisplayNameMark64Bit=wersja 64-bitowa +UninstallDisplayNameMarkAllUsers=wszyscy uytkownicy +UninstallDisplayNameMarkCurrentUser=biecy uytkownik + +; *** Post-installation errors +ErrorOpeningReadme=Wystpi bd podczas prby otwarcia pliku z informacjami dodatkowymi. +ErrorRestartingComputer=Instalator nie mg ponownie uruchomi tego komputera. Prosz wykona t czynno samodzielnie. + +; *** Uninstaller messages +UninstallNotFound=Plik "%1" nie istnieje. Nie mona przeprowadzi dezinstalacji. +UninstallOpenError=Plik "%1" nie mg zosta otwarty. Nie mona przeprowadzi dezinstalacji. +UninstallUnsupportedVer=Ta wersja programu dezinstalacyjnego nie rozpoznaje formatu logu dezinstalacji w pliku "%1". Nie mona przeprowadzi dezinstalacji. +UninstallUnknownEntry=W logu dezinstalacji wystpia nieznana pozycja (%1) +ConfirmUninstall=Czy na pewno chcesz usun aplikacj %1 i wszystkie jej skadniki? +UninstallOnlyOnWin64=Ta aplikacja moe by odinstalowana tylko w 64-bitowej wersji systemu Windows. +OnlyAdminCanUninstall=Ta instalacja moe by odinstalowana tylko przez uytkownika z uprawnieniami administratora. +UninstallStatusLabel=Poczekaj, a aplikacja %1 zostanie usunita z komputera. +UninstalledAll=Aplikacja %1 zostaa usunita z komputera. +UninstalledMost=Dezinstalacja aplikacji %1 zakoczya si.%n%nNiektre elementy nie mogy zosta usunite. Naley usun je samodzielnie. +UninstalledAndNeedsRestart=Komputer musi zosta ponownie uruchomiony, aby zakoczy proces dezinstalacji aplikacji %1.%n%nCzy chcesz teraz ponownie uruchomi komputer? +UninstallDataCorrupted=Plik "%1" jest uszkodzony. Nie mona przeprowadzi dezinstalacji. + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Usun plik wspdzielony? +ConfirmDeleteSharedFile2=System wskazuje, i nastpujcy plik nie jest ju uywany przez aden program. Czy chcesz odinstalowa ten plik wspdzielony?%n%nJeli inne programy nadal uywaj tego pliku, a zostanie on usunity, mog one przesta dziaa prawidowo. W przypadku braku pewnoci, kliknij przycisk Nie. Pozostawienie tego pliku w systemie nie spowoduje adnych szkd. +SharedFileNameLabel=Nazwa pliku: +SharedFileLocationLabel=Pooenie: +WizardUninstalling=Stan dezinstalacji +StatusUninstalling=Dezinstalacja aplikacji %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instalacja aplikacji %1. +ShutdownBlockReasonUninstallingApp=Dezinstalacja aplikacji %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 (wersja %2) +AdditionalIcons=Dodatkowe skrty: +CreateDesktopIcon=Utwrz skrt na &pulpicie +CreateQuickLaunchIcon=Utwrz skrt na pasku &szybkiego uruchamiania +ProgramOnTheWeb=Strona internetowa aplikacji %1 +UninstallProgram=Dezinstalacja aplikacji %1 +LaunchProgram=Uruchom aplikacj %1 +AssocFileExtension=&Przypisz aplikacj %1 do rozszerzenia pliku %2 +AssocingFileExtension=Przypisywanie aplikacji %1 do rozszerzenia pliku %2... +AutoStartProgramGroupDescription=Autostart: +AutoStartProgram=Automatycznie uruchamiaj aplikacj %1 +AddonHostProgramNotFound=Aplikacja %1 nie zostaa znaleziona we wskazanym przez Ciebie folderze.%n%nCzy pomimo tego chcesz kontynuowa? diff --git a/installer/innosetup/Languages/Portuguese.isl b/installer/innosetup/Languages/Portuguese.isl new file mode 100644 index 000000000..42d4e549c --- /dev/null +++ b/installer/innosetup/Languages/Portuguese.isl @@ -0,0 +1,366 @@ +; *** Inno Setup version 6.1.0+ Portuguese (Portugal) messages *** +; +; Maintained by Nuno Silva (nars AT gmx.net) + +[LangOptions] +LanguageName=Portugu<00EA>s (Portugal) +LanguageID=$0816 +LanguageCodePage=1252 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalao +SetupWindowTitle=%1 - Instalao +UninstallAppTitle=Desinstalao +UninstallAppFullTitle=%1 - Desinstalao + +; *** Misc. common +InformationTitle=Informao +ConfirmTitle=Confirmao +ErrorTitle=Erro + +; *** SetupLdr messages +SetupLdrStartupMessage=Ir ser instalado o %1. Deseja continuar? +LdrCannotCreateTemp=No foi possvel criar um ficheiro temporrio. Instalao cancelada +LdrCannotExecTemp=No foi possvel executar um ficheiro na directoria temporria. Instalao cancelada +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nErro %2: %3 +SetupFileMissing=O ficheiro %1 no foi encontrado na pasta de instalao. Corrija o problema ou obtenha uma nova cpia do programa. +SetupFileCorrupt=Os ficheiros de instalao esto corrompidos. Obtenha uma nova cpia do programa. +SetupFileCorruptOrWrongVer=Os ficheiros de instalao esto corrompidos, ou so incompatveis com esta verso do Assistente de Instalao. Corrija o problema ou obtenha uma nova cpia do programa. +InvalidParameter=Foi especificado um parmetro invlido na linha de comando:%n%n%1 +SetupAlreadyRunning=A instalao j est em execuo. +WindowsVersionNotSupported=Este programa no suporta a verso do Windows que est a utilizar. +WindowsServicePackRequired=Este programa necessita de %1 Service Pack %2 ou mais recente. +NotOnThisPlatform=Este programa no pode ser executado no %1. +OnlyOnThisPlatform=Este programa deve ser executado no %1. +OnlyOnTheseArchitectures=Este programa s pode ser instalado em verses do Windows preparadas para as seguintes arquitecturas:%n%n%1 +WinVersionTooLowError=Este programa necessita do %1 verso %2 ou mais recente. +WinVersionTooHighError=Este programa no pode ser instalado no %1 verso %2 ou mais recente. +AdminPrivilegesRequired=Deve iniciar sesso como administrador para instalar este programa. +PowerUserPrivilegesRequired=Deve iniciar sesso como administrador ou membro do grupo de Super Utilizadores para instalar este programa. +SetupAppRunningError=O Assistente de Instalao detectou que o %1 est em execuo. Feche-o e de seguida clique em OK para continuar, ou clique em Cancelar para cancelar a instalao. +UninstallAppRunningError=O Assistente de Desinstalao detectou que o %1 est em execuo. Feche-o e de seguida clique em OK para continuar, ou clique em Cancelar para cancelar a desinstalao. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Seleccione o Modo de Instalao +PrivilegesRequiredOverrideInstruction=Seleccione o Modo de Instalao +PrivilegesRequiredOverrideText1=%1 pode ser instalado para todos os utilizadores (necessita de privilgios administrativos), ou s para si. +PrivilegesRequiredOverrideText2=%1 pode ser instalado s para si, ou para todos os utilizadores (necessita de privilgios administrativos). +PrivilegesRequiredOverrideAllUsers=Instalar para &todos os utilizadores +PrivilegesRequiredOverrideAllUsersRecommended=Instalar para &todos os utilizadores (recomendado) +PrivilegesRequiredOverrideCurrentUser=Instalar apenas para &mim +PrivilegesRequiredOverrideCurrentUserRecommended=Instalar apenas para &mim (recomendado) + +; *** Misc. errors +ErrorCreatingDir=O Assistente de Instalao no consegue criar a directoria "%1" +ErrorTooManyFilesInDir=No possvel criar um ficheiro na directoria "%1" porque esta contm demasiados ficheiros + +; *** Setup common messages +ExitSetupTitle=Terminar a instalao +ExitSetupMessage=A instalao no est completa. Se terminar agora, o programa no ser instalado.%n%nMais tarde poder executar novamente este Assistente de Instalao e concluir a instalao.%n%nDeseja terminar a instalao? +AboutSetupMenuItem=&Acerca de... +AboutSetupTitle=Acerca do Assistente de Instalao +AboutSetupMessage=%1 verso %2%n%3%n%n%1 home page:%n%4 +AboutSetupNote= +TranslatorNote=Portuguese translation maintained by NARS (nars@gmx.net) + +; *** Buttons +ButtonBack=< &Anterior +ButtonNext=&Seguinte > +ButtonInstall=&Instalar +ButtonOK=OK +ButtonCancel=Cancelar +ButtonYes=&Sim +ButtonYesToAll=Sim para &todos +ButtonNo=&No +ButtonNoToAll=N&o para todos +ButtonFinish=&Concluir +ButtonBrowse=&Procurar... +ButtonWizardBrowse=P&rocurar... +ButtonNewFolder=&Criar Nova Pasta + +; *** "Select Language" dialog messages +SelectLanguageTitle=Seleccione o Idioma do Assistente de Instalao +SelectLanguageLabel=Seleccione o idioma para usar durante a Instalao. + +; *** Common wizard text +ClickNext=Clique em Seguinte para continuar ou em Cancelar para cancelar a instalao. +BeveledLabel= +BrowseDialogTitle=Procurar Pasta +BrowseDialogLabel=Seleccione uma pasta na lista abaixo e clique em OK. +NewFolderName=Nova Pasta + +; *** "Welcome" wizard page +WelcomeLabel1=Bem-vindo ao Assistente de Instalao do [name] +WelcomeLabel2=O Assistente de Instalao ir instalar o [name/ver] no seu computador.%n%n recomendado que feche todas as outras aplicaes antes de continuar. + +; *** "Password" wizard page +WizardPassword=Palavra-passe +PasswordLabel1=Esta instalao est protegida por palavra-passe. +PasswordLabel3=Insira a palavra-passe e de seguida clique em Seguinte para continuar. Na palavra-passe existe diferena entre maisculas e minsculas. +PasswordEditLabel=&Palavra-passe: +IncorrectPassword=A palavra-passe que introduziu no est correcta. Tente novamente. + +; *** "License Agreement" wizard page +WizardLicense=Contrato de licena +LicenseLabel= importante que leia as seguintes informaes antes de continuar. +LicenseLabel3=Leia atentamente o seguinte contrato de licena. Deve aceitar os termos do contrato antes de continuar a instalao. +LicenseAccepted=A&ceito o contrato +LicenseNotAccepted=&No aceito o contrato + +; *** "Information" wizard pages +WizardInfoBefore=Informao +InfoBeforeLabel= importante que leia as seguintes informaes antes de continuar. +InfoBeforeClickLabel=Quando estiver pronto para continuar clique em Seguinte. +WizardInfoAfter=Informao +InfoAfterLabel= importante que leia as seguintes informaes antes de continuar. +InfoAfterClickLabel=Quando estiver pronto para continuar clique em Seguinte. + +; *** "User Information" wizard page +WizardUserInfo=Informaes do utilizador +UserInfoDesc=Introduza as suas informaes. +UserInfoName=Nome do &utilizador: +UserInfoOrg=&Organizao: +UserInfoSerial=&Nmero de srie: +UserInfoNameRequired=Deve introduzir um nome. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Seleccione a localizao de destino +SelectDirDesc=Onde dever ser instalado o [name]? +SelectDirLabel3=O [name] ser instalado na seguinte pasta. +SelectDirBrowseLabel=Para continuar, clique em Seguinte. Se desejar seleccionar uma pasta diferente, clique em Procurar. +DiskSpaceGBLabel= necessrio pelo menos [gb] GB de espao livre em disco. +DiskSpaceMBLabel= necessrio pelo menos [mb] MB de espao livre em disco. +CannotInstallToNetworkDrive=O Assistente de Instalao no pode instalar numa unidade de rede. +CannotInstallToUNCPath=O Assistente de Instalao no pode instalar num caminho UNC. +InvalidPath= necessrio indicar o caminho completo com a letra de unidade; por exemplo:%n%nC:\APP%n%nou um caminho UNC no formato:%n%n\\servidor\partilha +InvalidDrive=A unidade ou partilha UNC seleccionada no existe ou no est acessvel. Seleccione outra. +DiskSpaceWarningTitle=No h espao suficiente no disco +DiskSpaceWarning=O Assistente de Instalao necessita de pelo menos %1 KB de espao livre, mas a unidade seleccionada tem apenas %2 KB disponveis.%n%nDeseja continuar de qualquer forma? +DirNameTooLong=O nome ou caminho para a pasta demasiado longo. +InvalidDirName=O nome da pasta no vlido. +BadDirName32=O nome da pasta no pode conter nenhum dos seguintes caracteres:%n%n%1 +DirExistsTitle=A pasta j existe +DirExists=A pasta:%n%n%1%n%nj existe. Pretende instalar nesta pasta? +DirDoesntExistTitle=A pasta no existe +DirDoesntExist=A pasta:%n%n%1%n%nno existe. Pretende que esta pasta seja criada? + +; *** "Select Components" wizard page +WizardSelectComponents=Seleccione os componentes +SelectComponentsDesc=Que componentes devero ser instalados? +SelectComponentsLabel2=Seleccione os componentes que quer instalar e desseleccione os componentes que no quer instalar. Clique em Seguinte quando estiver pronto para continuar. +FullInstallation=Instalao Completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Instalao Compacta +CustomInstallation=Instalao Personalizada +NoUninstallWarningTitle=Componentes Encontrados +NoUninstallWarning=O Assistente de Instalao detectou que os seguintes componentes esto instalados no seu computador:%n%n%1%n%nSe desseleccionar estes componentes eles no sero desinstalados.%n%nDeseja continuar? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=A seleco actual necessita de pelo menos [gb] GB de espao em disco. +ComponentsDiskSpaceMBLabel=A seleco actual necessita de pelo menos [mb] MB de espao em disco. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Seleccione tarefas adicionais +SelectTasksDesc=Que tarefas adicionais devero ser executadas? +SelectTasksLabel2=Seleccione as tarefas adicionais que deseja que o Assistente de Instalao execute na instalao do [name] e em seguida clique em Seguinte. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Seleccione a pasta do Menu Iniciar +SelectStartMenuFolderDesc=Onde devero ser colocados os cones de atalho do programa? +SelectStartMenuFolderLabel3=Os cones de atalho do programa sero criados na seguinte pasta do Menu Iniciar. +SelectStartMenuFolderBrowseLabel=Para continuar, clique em Seguinte. Se desejar seleccionar uma pasta diferente, clique em Procurar. +MustEnterGroupName= necessrio introduzir um nome para a pasta. +GroupNameTooLong=O nome ou caminho para a pasta demasiado longo. +InvalidGroupName=O nome da pasta no vlido. +BadGroupName=O nome da pasta no pode conter nenhum dos seguintes caracteres:%n%n%1 +NoProgramGroupCheck2=&No criar nenhuma pasta no Menu Iniciar + +; *** "Ready to Install" wizard page +WizardReady=Pronto para Instalar +ReadyLabel1=O Assistente de Instalao est pronto para instalar o [name] no seu computador. +ReadyLabel2a=Clique em Instalar para continuar a instalao, ou clique em Anterior se desejar rever ou alterar alguma das configuraes. +ReadyLabel2b=Clique em Instalar para continuar a instalao. +ReadyMemoUserInfo=Informaes do utilizador: +ReadyMemoDir=Localizao de destino: +ReadyMemoType=Tipo de instalao: +ReadyMemoComponents=Componentes seleccionados: +ReadyMemoGroup=Pasta do Menu Iniciar: +ReadyMemoTasks=Tarefas adicionais: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=A transferir ficheiros adicionais... +ButtonStopDownload=&Parar transferncia +StopDownload=Tem a certeza que deseja parar a transferncia? +ErrorDownloadAborted=Transferncia cancelada +ErrorDownloadFailed=Falha na transferncia: %1 %2 +ErrorDownloadSizeFailed=Falha ao obter tamanho: %1 %2 +ErrorFileHash1=Falha de verificao do ficheiro: %1 +ErrorFileHash2=Hash do ficheiro invlida: experado %1, encontrado %2 +ErrorProgress=Progresso invlido: %1 de %2 +ErrorFileSize=Tamanho de ficheiro invlido: experado %1, encontrado %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparando-se para instalar +PreparingDesc=Preparando-se para instalar o [name] no seu computador. +PreviousInstallNotCompleted=A instalao/remoo de um programa anterior no foi completada. Necessitar de reiniciar o computador para completar essa instalao.%n%nDepois de reiniciar o computador, execute novamente este Assistente de Instalao para completar a instalao do [name]. +CannotContinue=A instalao no pode continuar. Clique em Cancelar para sair. +ApplicationsFound=As seguintes aplicaes esto a utilizar ficheiros que necessitam ser actualizados pelo Assistente de Instalao. recomendado que permita que o Assistente de Instalao feche estas aplicaes. +ApplicationsFound2=As seguintes aplicaes esto a utilizar ficheiros que necessitam ser actualizados pelo Assistente de Instalao. recomendado que permita que o Assistente de Instalao feche estas aplicaes. Depois de completar a instalao, o Assistente de Instalao tentar reiniciar as aplicaes. +CloseApplications=&Fechar as aplicaes automaticamente +DontCloseApplications=&No fechar as aplicaes +ErrorCloseApplications=O Assistente de Instalao no conseguiu fechar todas as aplicaes automaticamente. Antes de continuar recomendado que feche todas as aplicaes que utilizem ficheiros que necessitem de ser actualizados pelo Assistente de Instalao. +PrepareToInstallNeedsRestart=O Assistente de Instalao necessita reiniciar o seu computador. Depois de reiniciar o computador, execute novamente o Assistente de Instalao para completar a instalao do [name].%n%nDeseja reiniciar agora? + +; *** "Installing" wizard page +WizardInstalling=A instalar +InstallingLabel=Aguarde enquanto o Assistente de Instalao instala o [name] no seu computador. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Instalao do [name] concluda +FinishedLabelNoIcons=O Assistente de Instalao concluiu a instalao do [name] no seu computador. +FinishedLabel=O Assistente de Instalao concluiu a instalao do [name] no seu computador. A aplicao pode ser iniciada atravs dos cones de atalho instalados. +ClickFinish=Clique em Concluir para finalizar o Assistente de Instalao. +FinishedRestartLabel=Para completar a instalao do [name], o Assistente de Instalao dever reiniciar o seu computador. Deseja reiniciar agora? +FinishedRestartMessage=Para completar a instalao do [name], o Assistente de Instalao dever reiniciar o seu computador.%n%nDeseja reiniciar agora? +ShowReadmeCheck=Sim, desejo ver o ficheiro LEIAME +YesRadio=&Sim, desejo reiniciar o computador agora +NoRadio=&No, desejo reiniciar o computador mais tarde +; used for example as 'Run MyProg.exe' +RunEntryExec=Executar %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Visualizar %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=O Assistente de Instalao precisa do disco seguinte +SelectDiskLabel2=Introduza o disco %1 e clique em OK.%n%nSe os ficheiros deste disco estiverem num local diferente do mostrado abaixo, indique o caminho correcto ou clique em Procurar. +PathLabel=&Caminho: +FileNotInDir2=O ficheiro "%1" no foi encontrado em "%2". Introduza o disco correcto ou seleccione outra pasta. +SelectDirectoryLabel=Indique a localizao do disco seguinte. + +; *** Installation phase messages +SetupAborted=A instalao no est completa.%n%nCorrija o problema e execute o Assistente de Instalao novamente. +AbortRetryIgnoreSelectAction=Seleccione uma aco +AbortRetryIgnoreRetry=&Tentar novamente +AbortRetryIgnoreIgnore=&Ignorar o erro e continuar +AbortRetryIgnoreCancel=Cancelar a instalao + +; *** Installation status messages +StatusClosingApplications=A fechar aplicaes... +StatusCreateDirs=A criar directorias... +StatusExtractFiles=A extrair ficheiros... +StatusCreateIcons=A criar atalhos... +StatusCreateIniEntries=A criar entradas em INI... +StatusCreateRegistryEntries=A criar entradas no registo... +StatusRegisterFiles=A registar ficheiros... +StatusSavingUninstall=A guardar informaes para desinstalao... +StatusRunProgram=A concluir a instalao... +StatusRestartingApplications=A reiniciar aplicaes... +StatusRollback=A anular as alteraes... + +; *** Misc. errors +ErrorInternal2=Erro interno: %1 +ErrorFunctionFailedNoCode=%1 falhou +ErrorFunctionFailed=%1 falhou; cdigo %2 +ErrorFunctionFailedWithMessage=%1 falhou; cdigo %2.%n%3 +ErrorExecutingProgram=No possvel executar o ficheiro:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Erro ao abrir a chave de registo:%n%1\%2 +ErrorRegCreateKey=Erro ao criar a chave de registo:%n%1\%2 +ErrorRegWriteKey=Erro ao escrever na chave de registo:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Erro ao criar entradas em INI no ficheiro "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Ignorar este ficheiro (no recomendado) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorar este erro e continuar (no recomendado) +SourceIsCorrupted=O ficheiro de origem est corrompido +SourceDoesntExist=O ficheiro de origem "%1" no existe +ExistingFileReadOnly2=O ficheiro existente no pode ser substitudo porque tem o atributo "s de leitura". +ExistingFileReadOnlyRetry=&Remover o atributo "s de leitura" e tentar novamente +ExistingFileReadOnlyKeepExisting=&Manter o ficheiro existente +ErrorReadingExistingDest=Ocorreu um erro ao tentar ler o ficheiro existente: +FileExistsSelectAction=Seleccione uma aco +FileExists2=O ficheiro j existe. +FileExistsOverwriteExisting=&Substituir o ficheiro existente +FileExistsKeepExisting=&Manter o ficheiro existente +FileExistsOverwriteOrKeepAll=&Fazer isto para os prximos conflitos +ExistingFileNewerSelectAction=Seleccione uma aco +ExistingFileNewer2=O ficheiro existente mais recente que o que est a ser instalado. +ExistingFileNewerOverwriteExisting=&Substituir o ficheiro existente +ExistingFileNewerKeepExisting=&Manter o ficheiro existente (recomendado) +ExistingFileNewerOverwriteOrKeepAll=&Fazer isto para os prximos conflitos +ErrorChangingAttr=Ocorreu um erro ao tentar alterar os atributos do ficheiro existente: +ErrorCreatingTemp=Ocorreu um erro ao tentar criar um ficheiro na directoria de destino: +ErrorReadingSource=Ocorreu um erro ao tentar ler o ficheiro de origem: +ErrorCopying=Ocorreu um erro ao tentar copiar um ficheiro: +ErrorReplacingExistingFile=Ocorreu um erro ao tentar substituir o ficheiro existente: +ErrorRestartReplace=RestartReplace falhou: +ErrorRenamingTemp=Ocorreu um erro ao tentar mudar o nome de um ficheiro na directoria de destino: +ErrorRegisterServer=No possvel registar o DLL/OCX: %1 +ErrorRegSvr32Failed=O RegSvr32 falhou com o cdigo de sada %1 +ErrorRegisterTypeLib=No foi possvel registar a livraria de tipos: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Todos os utilizadores +UninstallDisplayNameMarkCurrentUser=Utilizador actual + +; *** Post-installation errors +ErrorOpeningReadme=Ocorreu um erro ao tentar abrir o ficheiro LEIAME. +ErrorRestartingComputer=O Assistente de Instalao no consegue reiniciar o computador. Por favor reinicie manualmente. + +; *** Uninstaller messages +UninstallNotFound=O ficheiro "%1" no existe. No possvel desinstalar. +UninstallOpenError=No foi possvel abrir o ficheiro "%1". No possvel desinstalar. +UninstallUnsupportedVer=O ficheiro log de desinstalao "%1" est num formato que no reconhecido por esta verso do desinstalador. No possvel desinstalar +UninstallUnknownEntry=Foi encontrada uma entrada desconhecida (%1) no ficheiro log de desinstalao +ConfirmUninstall=Tem a certeza que deseja remover completamente o %1 e todos os seus componentes? +UninstallOnlyOnWin64=Esta desinstalao s pode ser realizada na verso de 64-bit's do Windows. +OnlyAdminCanUninstall=Esta desinstalao s pode ser realizada por um utilizador com privilgios administrativos. +UninstallStatusLabel=Por favor aguarde enquanto o %1 est a ser removido do seu computador. +UninstalledAll=O %1 foi removido do seu computador com sucesso. +UninstalledMost=A desinstalao do %1 est concluda.%n%nAlguns elementos no puderam ser removidos. Estes elementos podem ser removidos manualmente. +UninstalledAndNeedsRestart=Para completar a desinstalao do %1, o computador deve ser reiniciado.%n%nDeseja reiniciar agora? +UninstallDataCorrupted=O ficheiro "%1" est corrompido. No possvel desinstalar + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Remover ficheiro partilhado? +ConfirmDeleteSharedFile2=O sistema indica que o seguinte ficheiro partilhado j no est a ser utilizado por nenhum programa. Deseja remov-lo?%n%nSe algum programa ainda necessitar deste ficheiro, poder no funcionar correctamente depois de o remover. Se no tiver a certeza, seleccione No. Manter o ficheiro no causar nenhum problema. +SharedFileNameLabel=Nome do ficheiro: +SharedFileLocationLabel=Localizao: +WizardUninstalling=Estado da desinstalao +StatusUninstalling=A desinstalar o %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=A instalar %1. +ShutdownBlockReasonUninstallingApp=A desinstalar %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 verso %2 +AdditionalIcons=Atalhos adicionais: +CreateDesktopIcon=Criar atalho no Ambiente de &Trabalho +CreateQuickLaunchIcon=&Criar atalho na barra de Iniciao Rpida +ProgramOnTheWeb=%1 na Web +UninstallProgram=Desinstalar o %1 +LaunchProgram=Executar o %1 +AssocFileExtension=Associa&r o %1 aos ficheiros com a extenso %2 +AssocingFileExtension=A associar o %1 aos ficheiros com a extenso %2... +AutoStartProgramGroupDescription=Inicializao Automtica: +AutoStartProgram=Iniciar %1 automaticamente +AddonHostProgramNotFound=No foi possvel localizar %1 na pasta seleccionada.%n%nDeseja continuar de qualquer forma? diff --git a/installer/innosetup/Languages/Russian.isl b/installer/innosetup/Languages/Russian.isl new file mode 100644 index 000000000..bf086d065 --- /dev/null +++ b/installer/innosetup/Languages/Russian.isl @@ -0,0 +1,370 @@ +; *** Inno Setup version 6.1.0+ Russian messages *** +; +; Translated from English by Dmitry Kann, yktooo at gmail.com +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +LanguageName=<0420><0443><0441><0441><043A><0438><0439> +LanguageID=$0419 +LanguageCodePage=1251 + +[Messages] + +; *** Application titles +SetupAppTitle= +SetupWindowTitle= %1 +UninstallAppTitle= +UninstallAppFullTitle= %1 + +; *** Misc. common +InformationTitle= +ConfirmTitle= +ErrorTitle= + +; *** SetupLdr messages +SetupLdrStartupMessage= %1 , ? +LdrCannotCreateTemp= . +LdrCannotExecTemp= . +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%n %2: %3 +SetupFileMissing= %1 . , . +SetupFileCorrupt= . , . +SetupFileCorruptOrWrongVer= . , . +InvalidParameter= :%n%n%1 +SetupAlreadyRunning= . +WindowsVersionNotSupported= Windows, . +WindowsServicePackRequired= %1 Service Pack %2 . +NotOnThisPlatform= %1. +OnlyOnThisPlatform= %1. +OnlyOnTheseArchitectures= Windows :%n%n%1 +WinVersionTooLowError= %1 %2 . +WinVersionTooHighError= %1 %2 . +AdminPrivilegesRequired= , . +PowerUserPrivilegesRequired= , (Power Users). +SetupAppRunningError= %1.%n%n, , OK, , , . +UninstallAppRunningError= %1.%n%n, , OK, , , . + +; *** Startup questions +PrivilegesRequiredOverrideTitle= +PrivilegesRequiredOverrideInstruction= +PrivilegesRequiredOverrideText1=%1 ( ), . +PrivilegesRequiredOverrideText2=%1 , ( ). +PrivilegesRequiredOverrideAllUsers= & +PrivilegesRequiredOverrideAllUsersRecommended= & () +PrivilegesRequiredOverrideCurrentUser= & +PrivilegesRequiredOverrideCurrentUserRecommended= & () + +; *** Misc. errors +ErrorCreatingDir= "%1" +ErrorTooManyFilesInDir= "%1", + +; *** Setup common messages +ExitSetupTitle= +ExitSetupMessage= . , .%n%n , .%n%n ? +AboutSetupMenuItem=& ... +AboutSetupTitle= +AboutSetupMessage=%1, %2%n%3%n%n %1:%n%4 +AboutSetupNote= +TranslatorNote=Russian translation by Dmitry Kann, http://www.dk-soft.org/ + +; *** Buttons +ButtonBack=< & +ButtonNext=& > +ButtonInstall=& +ButtonOK=OK +ButtonCancel= +ButtonYes=& +ButtonYesToAll= & +ButtonNo=& +ButtonNoToAll=& +ButtonFinish=& +ButtonBrowse=&... +ButtonWizardBrowse=&... +ButtonNewFolder=& + +; *** "Select Language" dialog messages +SelectLanguageTitle= +SelectLanguageLabel= , . + +; *** Common wizard text +ClickNext= , , , . +BeveledLabel= +BrowseDialogTitle= +BrowseDialogLabel= ʻ. +NewFolderName= + +; *** "Welcome" wizard page +WelcomeLabel1= [name] +WelcomeLabel2= [name/ver] .%n%n , . + +; *** "Password" wizard page +WizardPassword= +PasswordLabel1= . +PasswordLabel3=, , . . +PasswordEditLabel=&: +IncorrectPassword= . , . + +; *** "License Agreement" wizard page +WizardLicense= +LicenseLabel=, , . +LicenseLabel3=, . , . +LicenseAccepted= & +LicenseNotAccepted= & + +; *** "Information" wizard pages +WizardInfoBefore= +InfoBeforeLabel=, , . +InfoBeforeClickLabel= , . +WizardInfoAfter= +InfoAfterLabel=, , . +InfoAfterClickLabel= , . + +; *** "User Information" wizard page +WizardUserInfo= +UserInfoDesc=, . +UserInfoName=& : +UserInfoOrg=&: +UserInfoSerial=& : +UserInfoNameRequired= . + +; *** "Select Destination Location" wizard page +WizardSelectDir= +SelectDirDesc= [name]? +SelectDirLabel3= [name] . +SelectDirBrowseLabel= , . , . +DiskSpaceGBLabel= [gb] . +DiskSpaceMBLabel= [mb] . +CannotInstallToNetworkDrive= . +CannotInstallToUNCPath= UNC-. +InvalidPath= ; :%n%nC:\APP%n%n UNC:%n%n\\_\_ +InvalidDrive= . , . +DiskSpaceWarningTitle= +DiskSpaceWarning= %1 , %2 .%n%n ? +DirNameTooLong= . +InvalidDirName= . +BadDirName32= : %n%n%1 +DirExistsTitle= +DirExists=%n%n%1%n%n . ? +DirDoesntExistTitle= +DirDoesntExist=%n%n%1%n%n . ? + +; *** "Select Components" wizard page +WizardSelectComponents= +SelectComponentsDesc= ? +SelectComponentsLabel2= , ; , . , . +FullInstallation= +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation= +CustomInstallation= +NoUninstallWarningTitle= +NoUninstallWarning= , :%n%n%1%n%n .%n%n? +ComponentSize1=%1 +ComponentSize2=%1 +ComponentsDiskSpaceGBLabel= [gb] . +ComponentsDiskSpaceMBLabel= [mb] . + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks= +SelectTasksDesc= ? +SelectTasksLabel2= , [name], : + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup= +SelectStartMenuFolderDesc= ? +SelectStartMenuFolderLabel3= . +SelectStartMenuFolderBrowseLabel= , . , . +MustEnterGroupName= . +GroupNameTooLong= . +InvalidGroupName= . +BadGroupName= :%n%n%1 +NoProgramGroupCheck2=& + +; *** "Ready to Install" wizard page +WizardReady= +ReadyLabel1= [name] . +ReadyLabel2a= , , , . +ReadyLabel2b= , . +ReadyMemoUserInfo= : +ReadyMemoDir= : +ReadyMemoType= : +ReadyMemoComponents= : +ReadyMemoGroup= : +ReadyMemoTasks= : + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel= ... +ButtonStopDownload=& +StopDownload= ? +ErrorDownloadAborted= +ErrorDownloadFailed= : %1 %2 +ErrorDownloadSizeFailed= : %1 %2 +ErrorFileHash1= : %1 +ErrorFileHash2= : %1, %2 +ErrorProgress= : %1 %2 +ErrorFileSize= : %1, %2 + +; *** "Preparing to Install" wizard page +WizardPreparing= +PreparingDesc= [name] . +PreviousInstallNotCompleted= . , .%n%n , [name]. +CannotContinue= . . +ApplicationsFound= , . . +ApplicationsFound2= , . . , . +CloseApplications=& +DontCloseApplications=& +ErrorCloseApplications= . , , . +PrepareToInstallNeedsRestart= . , , , [name].%n%n ? + +; *** "Installing" wizard page +WizardInstalling=... +InstallingLabel=, , [name] . + +; *** "Setup Completed" wizard page +FinishedHeadingLabel= [name] +FinishedLabelNoIcons= [name] . +FinishedLabel= [name] . . +ClickFinish= , . +FinishedRestartLabel= [name] . ? +FinishedRestartMessage= [name] .%n%n ? +ShowReadmeCheck= README +YesRadio=&, +NoRadio=&, +; used for example as 'Run MyProg.exe' +RunEntryExec= %1 +; used for example as 'View Readme.txt' +RunEntryShellExec= %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle= +SelectDiskLabel2=, %1 OK.%n%n , , . +PathLabel=&: +FileNotInDir2= "%1" "%2". , . +SelectDirectoryLabel=, . + +; *** Installation phase messages +SetupAborted= .%n%n, . +AbortRetryIgnoreSelectAction= +AbortRetryIgnoreRetry= & +AbortRetryIgnoreIgnore=& +AbortRetryIgnoreCancel= + +; *** Installation status messages +StatusClosingApplications= ... +StatusCreateDirs= ... +StatusExtractFiles= ... +StatusCreateIcons= ... +StatusCreateIniEntries= INI-... +StatusCreateRegistryEntries= ... +StatusRegisterFiles= ... +StatusSavingUninstall= ... +StatusRunProgram= ... +StatusRestartingApplications= ... +StatusRollback= ... + +; *** Misc. errors +ErrorInternal2= : %1 +ErrorFunctionFailedNoCode=%1: +ErrorFunctionFailed=%1: ; %2 +ErrorFunctionFailedWithMessage=%1: ; %2.%n%3 +ErrorExecutingProgram= :%n%1 + +; *** Registry errors +ErrorRegOpenKey= :%n%1\%2 +ErrorRegCreateKey= :%n%1\%2 +ErrorRegWriteKey= :%n%1\%2 + +; *** INI errors +ErrorIniEntry= INI- "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=& ( ) +FileAbortRetryIgnoreIgnoreNotRecommended=& ( ) +SourceIsCorrupted= +SourceDoesntExist= "%1" +ExistingFileReadOnly2= , . +ExistingFileReadOnlyRetry=& +ExistingFileReadOnlyKeepExisting=& +ErrorReadingExistingDest= : +FileExistsSelectAction= +FileExists2= . +FileExistsOverwriteExisting=& +FileExistsKeepExisting=& +FileExistsOverwriteOrKeepAll=& +ExistingFileNewerSelectAction= +ExistingFileNewer2= , . +ExistingFileNewerOverwriteExisting=& +ExistingFileNewerKeepExisting=& () +ExistingFileNewerOverwriteOrKeepAll=& +ErrorChangingAttr= : +ErrorCreatingTemp= : +ErrorReadingSource= : +ErrorCopying= : +ErrorReplacingExistingFile= : +ErrorRestartReplace= RestartReplace: +ErrorRenamingTemp= : +ErrorRegisterServer= DLL/OCX: %1 +ErrorRegSvr32Failed= RegSvr32, %1 +ErrorRegisterTypeLib= (Type Library): %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 +UninstallDisplayNameMark64Bit=64 +UninstallDisplayNameMarkAllUsers= +UninstallDisplayNameMarkCurrentUser= + +; *** Post-installation errors +ErrorOpeningReadme= README. +ErrorRestartingComputer= . , . + +; *** Uninstaller messages +UninstallNotFound= "%1" , . +UninstallOpenError= "%1". +UninstallUnsupportedVer= "%1" -. +UninstallUnknownEntry= (%1) +ConfirmUninstall= %1 ? +UninstallOnlyOnWin64= 64- Windows. +OnlyAdminCanUninstall= . +UninstallStatusLabel=, , %1 . +UninstalledAll= %1 . +UninstalledMost= %1 .%n%n . . +UninstalledAndNeedsRestart= %1 .%n%n ? +UninstallDataCorrupted= "%1" . + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle= ? +ConfirmDeleteSharedFile2= , . ?%n%n - , , . , . . +SharedFileNameLabel= : +SharedFileLocationLabel=: +WizardUninstalling= +StatusUninstalling= %1... + + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp= %1. +ShutdownBlockReasonUninstallingApp= %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1, %2 +AdditionalIcons= : +CreateDesktopIcon= & +CreateQuickLaunchIcon= & +ProgramOnTheWeb= %1 +UninstallProgram= %1 +LaunchProgram= %1 +AssocFileExtension=& %1 , %2 +AssocingFileExtension= %1 %2... +AutoStartProgramGroupDescription=: +AutoStartProgram= %1 +AddonHostProgramNotFound=%1 .%n%n ? diff --git a/installer/innosetup/Languages/SerbianCyrillic.isl b/installer/innosetup/Languages/SerbianCyrillic.isl index 0ea72f5e0..743212575 100644 --- a/installer/innosetup/Languages/SerbianCyrillic.isl +++ b/installer/innosetup/Languages/SerbianCyrillic.isl @@ -1,9 +1,9 @@ -; *** Inno Setup version 5.5.3+ Serbian (Cyrillic) messages *** +; *** Inno Setup version 6.1.0+ Serbian (Cyrillic) messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ ; -; Translated by Rancher (theranchcowboy@gmail.com). +; Translated by Rancher (theranchcowboy@gmail.com) and Davor (davornik@yahoo.com). ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno @@ -44,6 +44,7 @@ ErrorTitle= SetupLdrStartupMessage= %1. ? LdrCannotCreateTemp= . . LdrCannotExecTemp= . . +HelpTextNote= ; *** Startup error messages LastErrorMessage=%1.%n%n %2: %3 @@ -57,13 +58,21 @@ WindowsServicePackRequired= NotOnThisPlatform= %1. OnlyOnThisPlatform= %1. OnlyOnTheseArchitectures= :%n%n%1 -MissingWOW64APIs= 64- . %1 . WinVersionTooLowError= %1, %2 . WinVersionTooHighError= %1 %2 . AdminPrivilegesRequired= . PowerUserPrivilegesRequired= . SetupAppRunningError= %1 .%n%n . UninstallAppRunningError= %1 .%n%n . +; *** Startup questions +PrivilegesRequiredOverrideTitle= +PrivilegesRequiredOverrideInstruction= +PrivilegesRequiredOverrideText1=%1 ( ) . +PrivilegesRequiredOverrideText2=%1 ( ). +PrivilegesRequiredOverrideAllUsers= & +PrivilegesRequiredOverrideAllUsersRecommended= & () +PrivilegesRequiredOverrideCurrentUser= & +PrivilegesRequiredOverrideCurrentUserRecommended= & () ; *** Misc. errors ErrorCreatingDir= %1. @@ -76,7 +85,7 @@ AboutSetupMenuItem=& AboutSetupTitle= AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 AboutSetupNote= -TranslatorNote=Serbian translation by Rancher. +TranslatorNote= ; *** Buttons ButtonBack=< & @@ -143,6 +152,7 @@ WizardSelectDir= SelectDirDesc= [name]. SelectDirLabel3= [name] . SelectDirBrowseLabel= . , 腓. +DiskSpaceGBLabel= [gb] GB . DiskSpaceMBLabel= [mb] MB . CannotInstallToNetworkDrive= . CannotInstallToUNCPath= UNC . @@ -170,6 +180,7 @@ NoUninstallWarningTitle= NoUninstallWarning= :%n%n%1%n%n .%n%n ? ComponentSize1=%1 kB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel= [gb] GB . ComponentsDiskSpaceMBLabel= [mb] MB . ; *** "Select Additional Tasks" wizard page @@ -200,6 +211,18 @@ ReadyMemoComponents= ReadyMemoGroup= : ReadyMemoTasks= : +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel= ... +ButtonStopDownload=& +StopDownload= ? +ErrorDownloadAborted= +ErrorDownloadFailed= : %1 %2 +ErrorDownloadSizeFailed= : %1 %2 +ErrorFileHash1= : %1 +ErrorFileHash2= : %1, %2 +ErrorProgress= : %1 %2 +ErrorFileSize= : %1, %2 + ; *** "Preparing to Install" wizard page WizardPreparing= PreparingDesc= [name] . @@ -210,6 +233,7 @@ ApplicationsFound2= CloseApplications=& DontCloseApplications=& ErrorCloseApplications= . , . +PrepareToInstallNeedsRestart= . , [name].%n%n ? ; *** "Installing" wizard page WizardInstalling= @@ -239,7 +263,10 @@ SelectDirectoryLabel= ; *** Installation phase messages SetupAborted= .%n%n . -EntryAbortRetryIgnore= , . +AbortRetryIgnoreSelectAction= +AbortRetryIgnoreRetry=& +AbortRetryIgnoreIgnore=& +AbortRetryIgnoreCancel= ; *** Installation status messages StatusClosingApplications= @@ -270,14 +297,24 @@ ErrorRegWriteKey= ErrorIniEntry= INI %1. ; *** File copying errors -FileAbortRetryIgnore= , ( ) . -FileAbortRetryIgnore2= , ( ) . +FileAbortRetryIgnoreSkipNotRecommended=& ( ) +FileAbortRetryIgnoreIgnoreNotRecommended=& ( ) SourceIsCorrupted= SourceDoesntExist= %1 -ExistingFileReadOnly= .%n%n , . +ExistingFileReadOnly2= . +ExistingFileReadOnlyRetry=& +ExistingFileReadOnlyKeepExisting=& ErrorReadingExistingDest= : -FileExists= .%n%n ? -ExistingFileNewer= . .%n%n ? +FileExistsSelectAction= +FileExists2= . +FileExistsOverwriteExisting=& +FileExistsKeepExisting=& +FileExistsOverwriteOrKeepAll=& +ExistingFileNewerSelectAction= +ExistingFileNewer2= . +ExistingFileNewerOverwriteExisting=& +ExistingFileNewerKeepExisting=& () +ExistingFileNewerOverwriteOrKeepAll=& ErrorChangingAttr= : ErrorCreatingTemp= : ErrorReadingSource= : @@ -289,6 +326,16 @@ ErrorRegisterServer= ErrorRegSvr32Failed=RegSvr32 . %1 ErrorRegisterTypeLib= : %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers= +UninstallDisplayNameMarkCurrentUser= + ; *** Post-installation errors ErrorOpeningReadme= . ErrorRestartingComputer= . . diff --git a/installer/innosetup/Languages/SerbianLatin.isl b/installer/innosetup/Languages/SerbianLatin.isl index 4c28549d7..55ebbb8f5 100644 --- a/installer/innosetup/Languages/SerbianLatin.isl +++ b/installer/innosetup/Languages/SerbianLatin.isl @@ -1,9 +1,9 @@ -; *** Inno Setup version 5.5.3+ Serbian (Latin) messages *** +; *** Inno Setup version 6.1.0+ Serbian (Latin) messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ ; -; Translated by Rancher (theranchcowboy@gmail.com). +; Translated by Rancher (theranchcowboy@gmail.com) and Davor (davornik@yahoo.com). ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno @@ -44,6 +44,7 @@ ErrorTitle=Gre SetupLdrStartupMessage=Instaliraete %1. elite li da nastavite? LdrCannotCreateTemp=Ne mogu da napravim privremenu datoteku. Instalacija je prekinuta. LdrCannotExecTemp=Ne mogu da pokrenem datoteku u privremenoj fascikli. Instalacija je prekinuta. +HelpTextNote= ; *** Startup error messages LastErrorMessage=%1.%n%nGreka %2: %3 @@ -52,12 +53,11 @@ SetupFileCorrupt=Instalacione datoteke su o SetupFileCorruptOrWrongVer=Instalacione datoteke su oteene ili nisu saglasne s ovom verzijom instalacije. Ispravite problem ili nabavite novi primerak programa. InvalidParameter=Neispravan parametar je prenet na komandnu liniju: %n%n%1 SetupAlreadyRunning=Instalacija je ve pokrenuta. -WindowsVersionNotSupported=Program ne podrava izdanje vindousa koje koristite. +WindowsVersionNotSupported=Program ne podrava izdanje Windows-a koje koristite. WindowsServicePackRequired=Program zahteva %1 servisni paket %2 ili noviji. NotOnThisPlatform=Program nee raditi na %1. OnlyOnThisPlatform=Program e raditi na %1. -OnlyOnTheseArchitectures=Program se moe instalirati samo na izdanjima vindousa koji rade na sledeim arhitekturama procesora:%n%n%1 -MissingWOW64APIs=Izdanje vindousa koje koristite ne sadri funkcionalnost potrebnu za izvravanje 64-bitnih instalacija. Instalirajte servisni paket %1 da biste reili ovaj problem. +OnlyOnTheseArchitectures=Program se moe instalirati samo na izdanjima Windows-a koji rade na sledeim arhitekturama procesora:%n%n%1 WinVersionTooLowError=Program zahteva %1, izdanje %2 ili novije. WinVersionTooHighError=Program ne moete instalirati na %1 izdanju %2 ili novijem. AdminPrivilegesRequired=Morate biti prijavljeni kao administrator da biste instalirali program. @@ -65,6 +65,16 @@ PowerUserPrivilegesRequired=Morate biti prijavljeni kao administrator ili ovla SetupAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme U redu da nastavite ili Otkai da napustite instalaciju. UninstallAppRunningError=Program %1 je trenutno pokrenut.%n%nZatvorite ga i kliknite na dugme U redu da nastavite ili Otkai da napustite instalaciju. +; *** Startup questions +PrivilegesRequiredOverrideTitle=Odaberite nain instalacije +PrivilegesRequiredOverrideInstruction=Odaberite nain instalacije +PrivilegesRequiredOverrideText1=%1 moe biti instaliran za sve korisnike (zahteva administrativne privilegije) ili samo za vas. +PrivilegesRequiredOverrideText2=%1 moe da se instalira samo za vas ili za sve korisnike (zahteva administrativne privilegije). +PrivilegesRequiredOverrideAllUsers=Instaliraj za &sve korisnike +PrivilegesRequiredOverrideAllUsersRecommended=Instaliraj za &sve korisnike (preporueno) +PrivilegesRequiredOverrideCurrentUser=Instaliraj samo za &mene +PrivilegesRequiredOverrideCurrentUserRecommended=Instaliraj samo za &mene (preporueno) + ; *** Misc. errors ErrorCreatingDir=Ne mogu da napravim fasciklu %1. ErrorTooManyFilesInDir=Ne mogu da napravim datoteku u fascikli %1 jer sadri previe datoteka. @@ -74,9 +84,9 @@ ExitSetupTitle=Napu ExitSetupMessage=Instalacija nije zavrena. Ako sada izaete, program nee biti instaliran.%n%nInstalaciju moete pokrenuti i dovriti nekom dugom prilikom.%n%nelite li da je zatvorite? AboutSetupMenuItem=&O programu AboutSetupTitle=Podaci o programu -AboutSetupMessage=%1 verzija %2%n%3%n%n%1 matina stranica:%n%4 +AboutSetupMessage=%1 verzija %2%n%3%n%n%1 internet stranica:%n%4 AboutSetupNote= -TranslatorNote=Serbian translation by Rancher. +TranslatorNote= ; *** Buttons ButtonBack=< &Nazad @@ -89,13 +99,13 @@ ButtonYesToAll=D&a za sve ButtonNo=&Ne ButtonNoToAll=N&e za sve ButtonFinish=&Zavri -ButtonBrowse=&Potrai -ButtonWizardBrowse=&Potrai +ButtonBrowse=&Pretrai +ButtonWizardBrowse=&Pretrai ButtonNewFolder=&Napravi fasciklu ; *** "Select Language" dialog messages SelectLanguageTitle=Odabir jezika -SelectLanguageLabel=Izaberite jezik tokom instalacije: +SelectLanguageLabel=Izaberite jezik za korienje tokom instalacije: ; *** Common wizard text ClickNext=Kliknite na Dalje da nastavite ili Otkai da napustite instalaciju. @@ -143,6 +153,7 @@ WizardSelectDir=Odabir odredi SelectDirDesc=Izaberite mesto na kom elite da instalirate [name]. SelectDirLabel3=Program e instalirati [name] u sledeu fasciklu. SelectDirBrowseLabel=Kliknite na Dalje da nastavite. Ako elite da izaberete drugu fasciklu, kliknite na Potrai. +DiskSpaceGBLabel=Potrebno je najmanje [gb] GB slobodnog prostora na disku. DiskSpaceMBLabel=Potrebno je najmanje [mb] MB slobodnog prostora na disku. CannotInstallToNetworkDrive=Ne mogu da instaliram na mrenu jedinicu. CannotInstallToUNCPath=Ne mogu da instaliram na UNC putanju. @@ -170,6 +181,7 @@ NoUninstallWarningTitle=Komponente ve NoUninstallWarning=Sledee komponente ve postoje na raunaru:%n%n%1%n%nDetrikliranje ovih komponenti ih nee ukloniti.%n%nelite li da nastavite? ComponentSize1=%1 kB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Izabrane stavke zahtevaju najmanje [gb] GB slobodnog prostora. ComponentsDiskSpaceMBLabel=Izabrane stavke zahtevaju najmanje [mb] MB slobodnog prostora. ; *** "Select Additional Tasks" wizard page @@ -200,6 +212,18 @@ ReadyMemoComponents=Izabrane komponente: ReadyMemoGroup=Fascikla u meniju Start: ReadyMemoTasks=Dodatni zadaci: +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Preuzimanje dodatnih datoteka... +ButtonStopDownload=&Zaustavi preuzimanje +StopDownload=Da li ste sigurni da elite da zaustavite preuzimanje? +ErrorDownloadAborted=Preuzimanje je prekinuto +ErrorDownloadFailed=Preuzimanje nije uspelo: %1 %2 +ErrorDownloadSizeFailed=Dobijanje veliine nije uspelo: %1 %2 +ErrorFileHash1=He datoteke nije uspeo: %1 +ErrorFileHash2=Neispravan he datoteke: oekivan %1, pronaen %2 +ErrorProgress=Neispravan napredak: %1 od %2 +ErrorFileSize=Neispravna veliina datoteke: oekivan %1, pronaen %2 + ; *** "Preparing to Install" wizard page WizardPreparing=Priprema za instalaciju PreparingDesc=Program se priprema da instalira [name] na raunar. @@ -210,6 +234,7 @@ ApplicationsFound2=Slede CloseApplications=&Zatvori programe DontCloseApplications=&Ne zatvaraj programe ErrorCloseApplications=Ne mogu da zatvorim sve programe. Pre nego to nastavite, preporuujemo vam da zatvorite sve programe koji koriste datoteke koje treba da aurira instalacioni program. +PrepareToInstallNeedsRestart=Instalacija mora da ponovo pokrene raunar. Nakon ponovnog pokretanja raunara, ponovo pokrenite instalaciju da biste dovrili instalaciju [name].%n%nelite li da ponovo pokrenete raunar sada? ; *** "Installing" wizard page WizardInstalling=Instaliranje @@ -239,7 +264,10 @@ SelectDirectoryLabel=Izaberite mesto slede ; *** Installation phase messages SetupAborted=Instalacija nije zavrena.%n%nIspravite problem i pokrenite je ponovo. -EntryAbortRetryIgnore=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da nastavite u svakom sluaju ili Prekini da obustavite instalaciju. +AbortRetryIgnoreSelectAction=Odaberite radnju +AbortRetryIgnoreRetry=&Pokuaj opet +AbortRetryIgnoreIgnore=&Zanemari greku i nastavi +AbortRetryIgnoreCancel=Prekini instalaciju ; *** Installation status messages StatusClosingApplications=Zatvaram programe @@ -270,14 +298,24 @@ ErrorRegWriteKey=Gre ErrorIniEntry=Greka pri stvaranju INI unosa u datoteci %1. ; *** File copying errors -FileAbortRetryIgnore=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da preskoite datoteku (ne preporuuje se) ili Prekini da obustavite instalaciju. -FileAbortRetryIgnore2=Kliknite na Pokuaj opet da ponovite radnju, Zanemari da nastavite u svakom sluaju (ne preporuuje se) ili Prekini da obustavite instalaciju. +FileAbortRetryIgnoreSkipNotRecommended=&Preskoite ovu datoteku (ne preporuuje se) +FileAbortRetryIgnoreIgnoreNotRecommended=&Zanemari greku i nastavi (ne preporuuje se) SourceIsCorrupted=Izvorna datoteka je oteena SourceDoesntExist=Izvorna datoteka %1 ne postoji -ExistingFileReadOnly=Postojea datoteka je samo za itanje.%n%nKliknite na Pokuaj opet da uklonite osobinu samo za itanje i ponovite radnju, Zanemari da preskoite datoteku ili Prekini da obustavite instalaciju. +ExistingFileReadOnly2=Postojea datoteka ne moe da se zameni jer je samo za itanje. +ExistingFileReadOnlyRetry=&Uklonite atribut samo za itanje i pokuajte ponovo +ExistingFileReadOnlyKeepExisting=&Zadrite postojeu datoteku ErrorReadingExistingDest=Dolo je do greke pri pokuaju itanja postojee datoteke: -FileExists=Datoteka ve postoji.%n%nelite li da je zamenite? -ExistingFileNewer=Postojea datoteka je novija od one koju treba postaviti. Preporuujemo vam da zadrite postojeu datoteku.%n%nelite li to da uradite? +FileExistsSelectAction=Odaberi akciju +FileExists2=Datoteka ve postoji. +FileExistsOverwriteExisting=&Zameni postojeu datoteku +FileExistsKeepExisting=&Zadri postojeu datoteku +FileExistsOverwriteOrKeepAll=&Uradi ovo i ubudue +ExistingFileNewerSelectAction=Odaberi akciju +ExistingFileNewer2=Postojea datoteka je novija od one koju treba instalirati. +ExistingFileNewerOverwriteExisting=&Zameni postojeu datoteku +ExistingFileNewerKeepExisting=&Zadri postojeu datoteku (preporueno) +ExistingFileNewerOverwriteOrKeepAll=&Uradi ovo i ubudue ErrorChangingAttr=Dolo je do greke pri izmeni osobine sledee datoteke: ErrorCreatingTemp=Dolo je do greke pri stvaranju datoteke u odredinoj fascikli: ErrorReadingSource=Dolo je do greke pri itanju izvorne datoteke: @@ -289,6 +327,16 @@ ErrorRegisterServer=Ne mogu da upi ErrorRegSvr32Failed=RegSvr32 nije uspeo. Greka %1 ErrorRegisterTypeLib=Ne mogu da upiem biblioteku tipova: %1 +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Svi korisnici +UninstallDisplayNameMarkCurrentUser=Trenutni korisnik + ; *** Post-installation errors ErrorOpeningReadme=Dolo je do greke pri otvaranju tekstualne datoteke. ErrorRestartingComputer=Ne mogu ponovo da pokrenem raunar. Uradite to sami. diff --git a/installer/innosetup/Languages/Slovak.isl b/installer/innosetup/Languages/Slovak.isl new file mode 100644 index 000000000..fab212ebf --- /dev/null +++ b/installer/innosetup/Languages/Slovak.isl @@ -0,0 +1,385 @@ +; ****************************************************** +; *** *** +; *** Inno Setup version 6.1.0+ Slovak messages *** +; *** *** +; *** Original Author: *** +; *** *** +; *** Milan Potancok (milan.potancok AT gmail.com) *** +; *** *** +; *** Contributors: *** +; *** *** +; *** Ivo Bauer (bauer AT ozm.cz) *** +; *** *** +; *** Tomas Falb (tomasf AT pobox.sk) *** +; *** Slappy (slappy AT pobox.sk) *** +; *** Comments: (mitems58 AT gmail.com) *** +; *** *** +; *** Update: 28.01.2021 *** +; *** *** +; ****************************************************** +; +; + +[LangOptions] +LanguageName=Sloven<010D>ina +LanguageID=$041b +LanguageCodePage=1250 + +[Messages] + +; *** Application titles +SetupAppTitle=Sprievodca inštaláciou +SetupWindowTitle=Sprievodca inštaláciou - %1 +UninstallAppTitle=Sprievodca odinštaláciou +UninstallAppFullTitle=Sprievodca odinštaláciou - %1 + +; *** Misc. common +InformationTitle=Informácie +ConfirmTitle=Potvrdenie +ErrorTitle=Chyba + +; *** SetupLdr messages +SetupLdrStartupMessage=Víta Vás Sprievodca inštaláciou produktu %1. Prajete si pokračovať? +LdrCannotCreateTemp=Nie je možné vytvoriť dočasný súbor. Sprievodca inštaláciou sa ukončí +LdrCannotExecTemp=Nie je možné spustiť súbor v dočasnom adresári. Sprievodca inštaláciou sa ukončí +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nChyba %2: %3 +SetupFileMissing=Inštalačný adresár neobsahuje súbor %1. Opravte túto chybu, alebo si zaobstarajte novú kópiu tohto produktu. +SetupFileCorrupt=Súbory Sprievodcu inštaláciou sú poškodené. Zaobstarajte si novú kópiu tohto produktu. +SetupFileCorruptOrWrongVer=Súbory Sprievodcu inštaláciou sú poškodené alebo sa nezhodujú s touto verziou Sprievodcu inštaláciou. Opravte túto chybu, alebo si zaobstarajte novú kópiu tohto produktu. +InvalidParameter=Nesprávny parameter na príkazovom riadku: %n%n%1 +SetupAlreadyRunning=Inštalácia už prebieha. +WindowsVersionNotSupported=Tento program nepodporuje vašu verziu systému Windows. +WindowsServicePackRequired=Tento program vyžaduje %1 Service Pack %2 alebo novší. +NotOnThisPlatform=Tento produkt sa nedá spustiť v %1. +OnlyOnThisPlatform=Tento produkt musí byť spustený v %1. +OnlyOnTheseArchitectures=Tento produkt je možné nainštalovať iba vo verziách MS Windows s podporou architektúry procesorov:%n%n%1 +WinVersionTooLowError=Tento produkt vyžaduje %1 verzie %2 alebo vyššej. +WinVersionTooHighError=Tento produkt sa nedá nainštalovať vo %1 verzie %2 alebo vyššej. +AdminPrivilegesRequired=Na inštaláciu tohto produktu musíte byť prihlásený s právami administrátora. +PowerUserPrivilegesRequired=Na inštaláciu tohto produktu musíte byť prihlásený s právami Administrátora alebo člena skupiny Power Users. +SetupAppRunningError=Sprievodca inštaláciou zistil, že produkt %1 je teraz spustený.%n%nUkončte všetky spustené inštancie tohto produktu a pokračujte kliknutím na tlačidlo "OK", alebo ukončte inštaláciu tlačidlom "Zrušiť". +UninstallAppRunningError=Sprievodca odinštaláciou zistil, že produkt %1 je teraz spustený.%n%nUkončte všetky spustené inštancie tohto produktu a pokračujte kliknutím na tlačidlo "OK", alebo ukončte inštaláciu tlačidlom "Zrušiť". + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Vyberte inštalačný mód inštalátora +PrivilegesRequiredOverrideInstruction=Vyberte inštalačný mód +PrivilegesRequiredOverrideText1=%1 sa môže nainštalovať pre všetkých užívateľov (vyžaduje administrátorské práva), alebo len pre Vás. +PrivilegesRequiredOverrideText2=%1 sa môže nainštalovať len pre Vás, alebo pre všetkých užívateľov (vyžadujú sa Administrátorské práva). +PrivilegesRequiredOverrideAllUsers=Inštalovať pre &všetkých užívateľov +PrivilegesRequiredOverrideAllUsersRecommended=Inštalovať pre &všetkých užívateľov (odporúčané) +PrivilegesRequiredOverrideCurrentUser=Inštalovať len pre &mňa +PrivilegesRequiredOverrideCurrentUserRecommended=Inštalovať len pre &mňa (odporúčané) + +; *** Misc. errors +ErrorCreatingDir=Sprievodca inštaláciou nemohol vytvoriť adresár "%1" +ErrorTooManyFilesInDir=Nedá sa vytvoriť súbor v adresári "%1", pretože tento adresár už obsahuje príliš veľa súborov + +; *** Setup common messages +ExitSetupTitle=Ukončiť Sprievodcu inštaláciou +ExitSetupMessage=Inštalácia nebola kompletne dokončená. Ak teraz ukončíte Sprievodcu inštaláciou, produkt nebude nainštalovaný.%n%nSprievodcu inštaláciou môžete znovu spustiť neskôr a dokončiť tak inštaláciu.%n%nUkončiť Sprievodcu inštaláciou? +AboutSetupMenuItem=&O Sprievodcovi inštalácie... +AboutSetupTitle=O Sprievodcovi inštalácie +AboutSetupMessage=%1 verzia %2%n%3%n%n%1 domovská stránka:%n%4 +AboutSetupNote= +TranslatorNote=Slovak translation maintained by Milan Potancok (milan.potancok AT gmail.com), Ivo Bauer (bauer AT ozm.cz), Tomas Falb (tomasf AT pobox.sk) + Slappy (slappy AT pobox.sk) + +; *** Buttons +ButtonBack=< &Späť +ButtonNext=&Ďalej > +ButtonInstall=&Inštalovať +ButtonOK=OK +ButtonCancel=Zrušiť +ButtonYes=&Áno +ButtonYesToAll=Áno &všetkým +ButtonNo=&Nie +ButtonNoToAll=Ni&e všetkým +ButtonFinish=&Dokončiť +ButtonBrowse=&Prechádzať... +ButtonWizardBrowse=&Prechádzať... +ButtonNewFolder=&Vytvoriť nový adresár + +; *** "Select Language" dialog messages +SelectLanguageTitle=Výber jazyka Sprievodcu inštaláciou +SelectLanguageLabel=Zvoľte jazyk, ktorý sa má použiť pri inštalácii. + +; *** Common wizard text +ClickNext=Pokračujte kliknutím na tlačidlo "Ďalej", alebo ukončte sprievodcu inštaláciou tlačidlom "Zrušiť". +BeveledLabel= +BrowseDialogTitle=Nájsť adresár +BrowseDialogLabel=Z dole uvedeného zoznamu vyberte adresár a kliknite na "OK". +NewFolderName=Nový adresár + +; *** "Welcome" wizard page +WelcomeLabel1=Víta Vás Sprievodca inštaláciou produktu [name]. +WelcomeLabel2=Produkt [name/ver] sa nainštaluje do tohto počítača.%n%nSkôr, ako budete pokračovať, odporúčame ukončiť všetky spustené aplikácie. + +; *** "Password" wizard page +WizardPassword=Heslo +PasswordLabel1=Táto inštalácia je chránená heslom. +PasswordLabel3=Zadajte heslo a pokračujte kliknutím na tlačidlo "Ďalej". Pri zadávaní hesla rozlišujte malé a veľké písmená. +PasswordEditLabel=&Heslo: +IncorrectPassword=Zadané heslo nie je správne. Skúste to ešte raz prosím. + +; *** "License Agreement" wizard page +WizardLicense=Licenčná zmluva +LicenseLabel=Skôr, ako budete pokračovať, prečítajte si tieto dôležité informácie, prosím. +LicenseLabel3=Prečítajte si túto Licenčnú zmluvu prosím. Aby mohla inštalácia pokračovať, musíte súhlasiť s podmienkami tejto zmluvy. +LicenseAccepted=&Súhlasím s podmienkami Licenčnej zmluvy +LicenseNotAccepted=&Nesúhlasím s podmienkami Licenčnej zmluvy + +; *** "Information" wizard pages +WizardInfoBefore=Informácie +InfoBeforeLabel=Skôr, ako budete pokračovať, prečítajte si tieto dôležité informácie, prosím. +InfoBeforeClickLabel=Pokračujte v inštalácii kliknutím na tlačidlo "Ďalej". +WizardInfoAfter=Informácie +InfoAfterLabel=Skôr, ako budete pokračovať, prečítajte si tieto dôležité informácie prosím. +InfoAfterClickLabel=Pokračujte v inštalácii kliknutím na tlačidlo "Ďalej". + +; *** "User Information" wizard page +WizardUserInfo=Informácie o používateľovi +UserInfoDesc=Zadajte požadované informácie prosím. +UserInfoName=&Používateľské meno: +UserInfoOrg=&Organizácia: +UserInfoSerial=&Sériové číslo: +UserInfoNameRequired=Meno používateľa musí byť zadané. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Vyberte cieľový adresár +SelectDirDesc=Kde má byť produkt [name] nainštalovaný? +SelectDirLabel3=Sprievodca nainštaluje produkt [name] do nasledujúceho adresára. +SelectDirBrowseLabel=Pokračujte kliknutím na tlačidlo "Ďalej". Ak chcete vybrať iný adresár, kliknite na tlačidlo "Prechádzať". +DiskSpaceGBLabel=Inštalácia vyžaduje najmenej [gb] GB miesta v disku. +DiskSpaceMBLabel=Inštalácia vyžaduje najmenej [mb] MB miesta v disku. +CannotInstallToNetworkDrive=Sprievodca inštaláciou nemôže inštalovať do sieťovej jednotky. +CannotInstallToUNCPath=Sprievodca inštaláciou nemôže inštalovať do UNC umiestnenia. +InvalidPath=Musíte zadať úplnú cestu vrátane písmena jednotky; napríklad:%n%nC:\Aplikácia%n%nalebo cestu UNC v tvare:%n%n\\Server\Zdieľaný adresár +InvalidDrive=Vami vybraná jednotka alebo cesta UNC neexistuje, alebo nie je dostupná. Vyberte iné umiestnenie prosím. +DiskSpaceWarningTitle=Nedostatok miesta v disku +DiskSpaceWarning=Sprievodca inštaláciou vyžaduje najmenej %1 KB voľného miesta pre inštaláciu produktu, ale vo vybranej jednotke je dostupných iba %2 KB.%n%nAj napriek tomu chcete pokračovať? +DirNameTooLong=Názov adresára alebo cesta sú príliš dlhé. +InvalidDirName=Názov adresára nie je správny. +BadDirName32=Názvy adresárov nesmú obsahovať žiadny z nasledujúcich znakov:%n%n%1 +DirExistsTitle=Adresár už existuje +DirExists=Adresár:%n%n%1%n%nuž existuje. Aj napriek tomu chcete nainštalovať produkt do tohto adresára? +DirDoesntExistTitle=Adresár neexistuje +DirDoesntExist=Adresár: %n%n%1%n%nešte neexistuje. Má sa tento adresár vytvoriť? + +; *** "Select Components" wizard page +WizardSelectComponents=Vyberte komponenty +SelectComponentsDesc=Aké komponenty majú byť nainštalované? +SelectComponentsLabel2=Zaškrtnite iba komponenty, ktoré chcete nainštalovať; komponenty, ktoré se nemajú inštalovať, nechajte nezaškrtnuté. Pokračujte kliknutím na tlačidlo "Ďalej". +FullInstallation=Úplná inštalácia +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Kompaktná inštalácia +CustomInstallation=Voliteľná inštalácia +NoUninstallWarningTitle=Komponenty existujú +NoUninstallWarning=Sprievodca inštaláciou zistil že nasledujúce komponenty už sú v tomto počítači nainštalované:%n%n%1%n%nAk ich teraz nezahrniete do výberu, nebudú neskôr odinštalované.%n%nAj napriek tomu chcete pokračovať? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Vybrané komponenty vyžadujú najmenej [gb] GB miesta v disku. +ComponentsDiskSpaceMBLabel=Vybrané komponenty vyžadujú najmenej [mb] MB miesta v disku. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Vyberte ďalšie úlohy +SelectTasksDesc=Ktoré ďalšie úlohy majú byť vykonané? +SelectTasksLabel2=Vyberte ďalšie úlohy, ktoré majú byť vykonané počas inštalácie produktu [name] a pokračujte kliknutím na tlačidlo "Ďalej". + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Vyberte skupinu v ponuke Štart +SelectStartMenuFolderDesc=Kam má sprievodca inštalácie umiestniť zástupcov aplikácie? +SelectStartMenuFolderLabel3=Sprievodca inštaláciou vytvorí zástupcov aplikácie v nasledujúcom adresári ponuky Štart. +SelectStartMenuFolderBrowseLabel=Pokračujte kliknutím na tlačidlo Ďalej. Ak chcete zvoliť iný adresár, kliknite na tlačidlo "Prechádzať". +MustEnterGroupName=Musíte zadať názov skupiny. +GroupNameTooLong=Názov adresára alebo cesta sú príliš dlhé. +InvalidGroupName=Názov adresára nie je správny. +BadGroupName=Názov skupiny nesmie obsahovať žiadny z nasledujúcich znakov:%n%n%1 +NoProgramGroupCheck2=&Nevytvárať skupinu v ponuke Štart + +; *** "Ready to Install" wizard page +WizardReady=Inštalácia je pripravená +ReadyLabel1=Sprievodca inštaláciou je teraz pripravený nainštalovať produkt [name] na Váš počítač. +ReadyLabel2a=Pokračujte v inštalácii kliknutím na tlačidlo "Inštalovať". Ak chcete zmeniť niektoré nastavenia inštalácie, kliknite na tlačidlo "< Späť". +ReadyLabel2b=Pokračujte v inštalácii kliknutím na tlačidlo "Inštalovať". +ReadyMemoUserInfo=Informácie o používateľovi: +ReadyMemoDir=Cieľový adresár: +ReadyMemoType=Typ inštalácie: +ReadyMemoComponents=Vybrané komponenty: +ReadyMemoGroup=Skupina v ponuke Štart: +ReadyMemoTasks=Ďalšie úlohy: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Sťahovanie dodatočných súborov... +ButtonStopDownload=&Zastaviť sťahovanie +StopDownload=Naozaj chcete zastaviť sťahovanie? +ErrorDownloadAborted=Sťahovanie prerušené +ErrorDownloadFailed=Sťahovanie zlyhalo: %1 %2 +ErrorDownloadSizeFailed=Zlyhalo získanie veľkosti: %1 %2 +ErrorFileHash1=Kontrola hodnoty súboru zlyhala: %1 +ErrorFileHash2=Nesprávna kontrolná hodnota: očakávala sa %1, zistená %2 +ErrorProgress=Nesprávny priebeh: %1 z %2 +ErrorFileSize=Nesprávna veľkosť súboru: očakávala sa %1, zistená %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Príprava inštalácie +PreparingDesc=Sprievodca inštaláciou pripravuje inštaláciu produktu [name] do tohto počítača. +PreviousInstallNotCompleted=Inštalácia/odinštalácia predošlého produktu nebola úplne dokončená. Dokončenie tohto procesu vyžaduje reštart počítača.%n%nPo reštartovaní počítača znovu spustite Sprievodcu inštaláciou, aby bolo možné kompletne dokončiť inštaláciu produktu [name]. +CannotContinue=Sprievodca inštaláciou nemôže pokračovať. Ukončite, prosím, sprievodcu inštaláciou kliknutím na tlačidlo "Zrušiť". +ApplicationsFound=Nasledujúce aplikácie pracujú so súbormi, ktoré musí Sprievodca inštaláciou aktualizovať. Odporúčame, aby ste povolili Sprievodcovi inštaláciou automaticky ukončiť tieto aplikácie. +ApplicationsFound2=Nasledujúce aplikácie pracujú so súbormi, ktoré musí Sprievodca inštaláciou aktualizovať. Odporúčame, aby ste povolili Sprievodcovi inštaláciou automaticky ukončiť tieto aplikácie. Po dokončení inštalácie sa Sprievodca inštaláciou pokúsi tieto aplikácie opätovne spustiť. +CloseApplications=&Automaticky ukončiť aplikácie +DontCloseApplications=&Neukončovať aplikácie +ErrorCloseApplications=Sprievodca inštaláciou nemohol automaticky zatvoriť všetky aplikácie. Odporúčame, aby ste ručne ukončili všetky aplikácie, ktoré používajú súbory a ktoré má Sprievodca aktualizovať. +PrepareToInstallNeedsRestart=Sprievodca inštaláciou potrebuje reštartovať tento počítač. Po reštartovaní počítača znovu spustite tohto Sprievodcu inštaláciou, aby sa inštalácia [name] dokončila.%n%nChcete teraz reštartovať tento počítač? + +; *** "Installing" wizard page +WizardInstalling=Inštalujem +InstallingLabel=Počkajte prosím, pokiaľ Sprievodca inštaláciou dokončí inštaláciu produktu [name] do tohto počítača. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Dokončuje sa inštalácia produktu [name] +FinishedLabelNoIcons=Sprievodca inštaláciou dokončil inštaláciu produktu [name] do tohto počítača. +FinishedLabel=Sprievodca inštaláciou dokončil inštaláciu produktu [name] do tohto počítača. Produkt je možné spustiť pomocou nainštalovaných ikon a zástupcov. +ClickFinish=Ukončte Sprievodcu inštaláciou kliknutím na tlačidlo "Dokončiť". +FinishedRestartLabel=Pre dokončenie inštalácie produktu [name] je nutné reštartovať tento počítač. Želáte si teraz reštartovať tento počítač? +FinishedRestartMessage=Pre dokončenie inštalácie produktu [name] je nutné reštartovať tento počítač.%n%nŽeláte si teraz reštartovať tento počítač? +ShowReadmeCheck=Áno, chcem zobraziť dokument "ČITAJMA" +YesRadio=&Áno, chcem teraz reštartovať počítač +NoRadio=&Nie, počítač reštartujem neskôr + +; used for example as 'Run MyProg.exe' +RunEntryExec=Spustiť %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Zobraziť %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Sprievodca inštaláciou vyžaduje ďalší disk +SelectDiskLabel2=Vložte prosím, disk %1 a kliknite na tlačidlo "OK".%n%nAk sa súbory tohto disku nachádzajú v inom adresári ako v tom, ktorý je zobrazený nižšie, zadajte správnu cestu alebo kliknite na tlačidlo "Prechádzať". +PathLabel=&Cesta: +FileNotInDir2=Súbor "%1" sa nedá nájsť v "%2". Vložte prosím, správny disk, alebo zvoľte iný adresár. +SelectDirectoryLabel=Špecifikujte prosím, umiestnenie ďalšieho disku. + +; *** Installation phase messages +SetupAborted=Inštalácia nebola úplne dokončená.%n%nOpravte chybu a opäť spustite Sprievodcu inštaláciou prosím. +AbortRetryIgnoreSelectAction=Vyberte akciu +AbortRetryIgnoreRetry=&Skúsiť znovu +AbortRetryIgnoreIgnore=&Ignorovať chybu a pokračovať +AbortRetryIgnoreCancel=Zrušiť inštaláciu + +; *** Installation status messages +StatusClosingApplications=Ukončovanie aplikácií... +StatusCreateDirs=Vytvárajú sa adresáre... +StatusExtractFiles=Rozbaľujú sa súbory... +StatusCreateIcons=Vytvárajú sa ikony a zástupcovia... +StatusCreateIniEntries=Vytvárajú sa záznamy v konfiguračných súboroch... +StatusCreateRegistryEntries=Vytvárajú sa záznamy v systémovom registri... +StatusRegisterFiles=Registrujú sa súbory... +StatusSavingUninstall=Ukladajú sa informácie potrebné pre neskoršie odinštalovanie produktu... +StatusRunProgram=Dokončuje sa inštalácia... +StatusRestartingApplications=Reštartovanie aplikácií... +StatusRollback=Vykonané zmeny sa vracajú späť... + +; *** Misc. errors +ErrorInternal2=Interná chyba: %1 +ErrorFunctionFailedNoCode=%1 zlyhala +ErrorFunctionFailed=%1 zlyhala; kód %2 +ErrorFunctionFailedWithMessage=%1 zlyhala; kód %2.%n%3 +ErrorExecutingProgram=Nedá sa spustiť súbor:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Došlo k chybe pri otváraní kľúča systémového registra:%n%1\%2 +ErrorRegCreateKey=Došlo k chybe pri vytváraní kľúča systémového registra:%n%1\%2 +ErrorRegWriteKey=Došlo k chybe pri zápise kľúča do systémového registra:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Došlo k chybe pri vytváraní záznamu v konfiguračnom súbore "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Preskočiť tento súbor (neodporúčané) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorovať chybu a pokračovať (neodporúčané) +SourceIsCorrupted=Zdrojový súbor je poškodený +SourceDoesntExist=Zdrojový súbor "%1" neexistuje +ExistingFileReadOnly2=Existujúci súbor nie je možné prepísať, pretože je označený atribútom Iba na čítanie. +ExistingFileReadOnlyRetry=&Odstrániť atribút Iba na čítanie a skúsiť znovu +ExistingFileReadOnlyKeepExisting=&Ponechať existujúci súbor +ErrorReadingExistingDest=Došlo k chybe pri pokuse o čítanie existujúceho súboru: +FileExistsSelectAction=Vyberte akciu +FileExists2=Súbor už existuje. +FileExistsOverwriteExisting=&Prepísať existujúci súbor +FileExistsKeepExisting=Ponechať &existujúci súbor +FileExistsOverwriteOrKeepAll=&Vykonať pre všetky ďalšie konflikty +ExistingFileNewerSelectAction=Vyberte akciu +ExistingFileNewer2=Existujúci súbor je novší ako súbor, ktorý sa Sprievodca inštaláciou pokúša nainštalovať. +ExistingFileNewerOverwriteExisting=&Prepísať existujúci súbor +ExistingFileNewerKeepExisting=Ponechať &existujúci súbor (odporúčané) +ExistingFileNewerOverwriteOrKeepAll=&Vykonať pre všetky ďalšie konflikty +ErrorChangingAttr=Došlo k chybe pri pokuse o modifikáciu atribútov existujúceho súboru: +ErrorCreatingTemp=Došlo k chybe pri pokuse o vytvorenie súboru v cieľovom adresári: +ErrorReadingSource=Došlo k chybe pri pokuse o čítanie zdrojového súboru: +ErrorCopying=Došlo k chybe pri pokuse o skopírovanie súboru: +ErrorReplacingExistingFile=Došlo k chybe pri pokuse o nahradenie existujúceho súboru: +ErrorRestartReplace=Zlyhala funkcia "RestartReplace" Sprievodcu inštaláciou: +ErrorRenamingTemp=Došlo k chybe pri pokuse o premenovanie súboru v cieľovom adresári: +ErrorRegisterServer=Nedá sa vykonať registrácia DLL/OCX: %1 +ErrorRegSvr32Failed=Volanie RegSvr32 zlyhalo s návratovým kódom %1 +ErrorRegisterTypeLib=Nedá sa vykonať registrácia typovej knižnice: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32bitový +UninstallDisplayNameMark64Bit=64bitový +UninstallDisplayNameMarkAllUsers=Všetci užívatelia +UninstallDisplayNameMarkCurrentUser=Aktuálny užívateľ + +; *** Post-installation errors +ErrorOpeningReadme=Došlo k chybe pri pokuse o otvorenie dokumentu "ČITAJMA". +ErrorRestartingComputer=Sprievodcovi inštaláciou sa nepodarilo reštartovať tento počítač. Reštartujte ho manuálne prosím. + +; *** Uninstaller messages +UninstallNotFound=Súbor "%1" neexistuje. Produkt sa nedá odinštalovať. +UninstallOpenError=Súbor "%1" nie je možné otvoriť. Produkt nie je možné odinštalovať. +UninstallUnsupportedVer=Sprievodcovi odinštaláciou sa nepodarilo rozpoznať formát súboru obsahujúceho informácie na odinštalovanie produktu "%1". Produkt sa nedá odinštalovať +UninstallUnknownEntry=V súbore obsahujúcom informácie na odinštalovanie produktu bola zistená neznáma položka (%1) +ConfirmUninstall=Naozaj chcete odinštalovať %1 a všetky jeho komponenty? +UninstallOnlyOnWin64=Tento produkt je možné odinštalovať iba v 64-bitových verziách MS Windows. +OnlyAdminCanUninstall=K odinštalovaniu tohto produktu musíte byť prihlásený s právami Administrátora. +UninstallStatusLabel=Počkajte prosím, kým produkt %1 nebude odinštalovaný z tohto počítača. +UninstalledAll=%1 bol úspešne odinštalovaný z tohto počítača. +UninstalledMost=%1 bol odinštalovaný z tohto počítača.%n%nNiektoré jeho komponenty sa však nepodarilo odinštalovať. Môžete ich odinštalovať manuálne. +UninstalledAndNeedsRestart=Na dokončenie odinštalácie produktu %1 je potrebné reštartovať tento počítač.%n%nChcete ihneď reštartovať tento počítač? +UninstallDataCorrupted=Súbor "%1" je poškodený. Produkt sa nedá odinštalovať + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Odinštalovať zdieľaný súbor? +ConfirmDeleteSharedFile2=Systém indikuje, že nasledujúci zdieľaný súbor nie je používaný žiadnymi inými aplikáciami. Má Sprievodca odinštaláciou tento zdieľaný súbor odstrániť?%n%nAk niektoré aplikácie tento súbor používajú, nemusia po jeho odinštalovaní pracovať správne. Pokiaľ to neviete správne posúdiť, odporúčame zvoliť "Nie". Ponechanie tohto súboru v systéme nespôsobí žiadnu škodu. +SharedFileNameLabel=Názov súboru: +SharedFileLocationLabel=Umiestnenie: +WizardUninstalling=Stav odinštalovania +StatusUninstalling=Prebieha odinštalovanie %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Inštalovanie %1. +ShutdownBlockReasonUninstallingApp=Odinštalovanie %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 verzia %2 +AdditionalIcons=Ďalší zástupcovia: +CreateDesktopIcon=Vytvoriť zástupcu na &ploche +CreateQuickLaunchIcon=Vytvoriť zástupcu na paneli &Rýchle spustenie +ProgramOnTheWeb=Aplikácia %1 na internete +UninstallProgram=Odinštalovať aplikáciu %1 +LaunchProgram=Spustiť aplikáciu %1 +AssocFileExtension=Vytvoriť &asociáciu medzi súbormi typu %2 a aplikáciou %1 +AssocingFileExtension=Vytvára sa asociácia medzi súbormi typu %2 a aplikáciou %1... +AutoStartProgramGroupDescription=Pri spustení: +AutoStartProgram=Automaticky spustiť %1 +AddonHostProgramNotFound=Nepodarilo sa nájsť %1 v adresári, ktorý ste zvolili.%n%nChcete napriek tomu pokračovať? diff --git a/installer/innosetup/Languages/Slovenian.isl b/installer/innosetup/Languages/Slovenian.isl new file mode 100644 index 000000000..248b688ca --- /dev/null +++ b/installer/innosetup/Languages/Slovenian.isl @@ -0,0 +1,370 @@ +; *** Inno Setup version 6.1.0+ Slovenian messages *** +; +; To download user-contributed translations of this file, go to: +; http://www.jrsoftware.org/is3rdparty.php +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Maintained by Jernej Simoncic (jernej+s-innosetup@eternallybored.org) + +[LangOptions] +LanguageName=Slovenski +LanguageID=$0424 +LanguageCodePage=1250 + +DialogFontName= +[Messages] + +; *** Application titles +SetupAppTitle=Namestitev +SetupWindowTitle=Namestitev - %1 +UninstallAppTitle=Odstranitev +UninstallAppFullTitle=Odstranitev programa %1 + +; *** Misc. common +InformationTitle=Informacija +ConfirmTitle=Potrditev +ErrorTitle=Napaka + +; *** SetupLdr messages +SetupLdrStartupMessage=V raunalnik boste namestili program %1. elite nadaljevati? +LdrCannotCreateTemp=Ni bilo mogoe ustvariti zaasne datoteke. Namestitev je prekinjena +LdrCannotExecTemp=Ni bilo mogoe zagnati datoteke v zaasni mapi. Namestitev je prekinjena + +; *** Startup error messages +LastErrorMessage=%1.%n%nNapaka %2: %3 +SetupFileMissing=Datoteka %1 manjka. Odpravite napako ali si priskrbite drugo kopijo programa. +SetupFileCorrupt=Datoteke namestitvenega programa so okvarjene. Priskrbite si drugo kopijo programa. +SetupFileCorruptOrWrongVer=Datoteke so okvarjene ali nezdruljive s to razliico namestitvenega programa. Odpravite napako ali si priskrbite drugo kopijo programa. +InvalidParameter=Naveden je bil napaen parameter ukazne vrstice:%n%n%1 +SetupAlreadyRunning=Namestitveni program se e izvaja. +WindowsVersionNotSupported=Program ne deluje na vai razliici sistema Windows. +WindowsServicePackRequired=Program potrebuje %1 s servisnim paketom %2 ali novejo razliico. +NotOnThisPlatform=Program ni namenjen za uporabo v %1. +OnlyOnThisPlatform=Program je namenjen le za uporabo v %1. +OnlyOnTheseArchitectures=Program lahko namestite le na Windows sistemih, na naslednjih vrstah procesorjev:%n%n%1 +WinVersionTooLowError=Ta program zahteva %1 razliico %2 ali novejo. +WinVersionTooHighError=Tega programa ne morete namestiti v %1 razliice %2 ali noveje. +AdminPrivilegesRequired=Za namestitev programa morate biti prijavljeni v raun s skrbnikimi pravicami. +PowerUserPrivilegesRequired=Za namestitev programa morate biti prijavljeni v raun s skrbnikimi ali power user pravicami. +SetupAppRunningError=Program %1 je trenutno odprt.%n%nZaprite program, nato kliknite V redu za nadaljevanje ali Preklii za izhod. +UninstallAppRunningError=Program %1 je trenutno odprt.%n%nZaprite program, nato kliknite V redu za nadaljevanje ali Preklii za izhod. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Izberite nain namestitve +PrivilegesRequiredOverrideInstruction=Izberite nain namestitve +PrivilegesRequiredOverrideText1=Program %1 lahko namestite za vse uporabnike (potrebujete skrbnike pravice), ali pa samo za vas. +PrivilegesRequiredOverrideText2=Program %1 lahko namestite samo za vas, ali pa za vse uporabnike (potrebujete skrbnike pravice). +PrivilegesRequiredOverrideAllUsers=N&amesti za vse uporabnike +PrivilegesRequiredOverrideAllUsersRecommended=N&amesti za vse uporabnike (priporoeno) +PrivilegesRequiredOverrideCurrentUser=Namesti samo za&me +PrivilegesRequiredOverrideCurrentUserRecommended=Namesti samo za&me (priporoeno) + +; *** Misc. errors +ErrorCreatingDir=Namestitveni program ni mogel ustvariti mape %1 +ErrorTooManyFilesInDir=Namestitveni program ne more ustvariti nove datoteke v mapi %1, ker vsebuje preve datotek + +; *** Setup common messages +ExitSetupTitle=Prekini namestitev +ExitSetupMessage=Namestitev ni konana. e jo boste prekinili, program ne bo nameen.%n%nPonovno namestitev lahko izvedete kasneje.%n%nelite prekiniti namestitev? +AboutSetupMenuItem=&O namestitvenem programu... +AboutSetupTitle=O namestitvenem programu +AboutSetupMessage=%1 razliica %2%n%3%n%n%1 domaa stran:%n%4 +AboutSetupNote= +TranslatorNote=Slovenski prevod:%nMiha Remec%nJernej Simoni + +; *** Buttons +ButtonBack=< Na&zaj +ButtonNext=&Naprej > +ButtonInstall=&Namesti +ButtonOK=V redu +ButtonCancel=Preklii +ButtonYes=&Da +ButtonYesToAll=Da za &vse +ButtonNo=&Ne +ButtonNoToAll=N&e za vse +ButtonFinish=&Konaj +ButtonBrowse=Pre&brskaj... +ButtonWizardBrowse=Pre&brskaj... +ButtonNewFolder=&Ustvari novo mapo + +; *** "Select Language" dialog messages +SelectLanguageTitle=Izbira jezika namestitve +SelectLanguageLabel=Izberite jezik, ki ga elite uporabljati med namestitvijo. + +; *** Common wizard text +ClickNext=Kliknite Naprej za nadaljevanje namestitve ali Preklii za prekinitev namestitve. +BeveledLabel= +BrowseDialogTitle=Izbira mape +BrowseDialogLabel=Izberite mapo s spiska, nato kliknite V redu. +NewFolderName=Nova mapa + +; *** "Welcome" wizard page +WelcomeLabel1=Dobrodoli v namestitev programa [name]. +WelcomeLabel2=V raunalnik boste namestili program [name/ver].%n%nPriporoljivo je, da pred zaetkom namestitve zaprete vse odprte programe. + +; *** "Password" wizard page +WizardPassword=Geslo +PasswordLabel1=Namestitev je zaitena z geslom. +PasswordLabel3=Vnesite geslo, nato kliknite Naprej za nadaljevanje. Pri vnaanju pazite na male in velike rke. +PasswordEditLabel=&Geslo: +IncorrectPassword=Vneseno geslo ni pravilno. Poizkusite ponovno. + +; *** "License Agreement" wizard page +WizardLicense=Licenna pogodba +LicenseLabel=Pred nadaljevanjem preberite licenno pogodbo za uporabo programa. +LicenseLabel3=Preberite licenno pogodbo za uporabo programa. Program lahko namestite le, e se s pogodbo v celoti strinjate. +LicenseAccepted=&Da, sprejemam vse pogoje licenne pogodbe +LicenseNotAccepted=N&e, pogojev licenne pogodbe ne sprejmem + +; *** "Information" wizard pages +WizardInfoBefore=Informacije +InfoBeforeLabel=Pred nadaljevanjem preberite naslednje pomembne informacije. +InfoBeforeClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej. +WizardInfoAfter=Informacije +InfoAfterLabel=Pred nadaljevanjem preberite naslednje pomembne informacije. +InfoAfterClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej. + +; *** "User Information" wizard page +WizardUserInfo=Podatki o uporabniku +UserInfoDesc=Vnesite svoje podatke. +UserInfoName=&Ime: +UserInfoOrg=&Podjetje: +UserInfoSerial=&Serijska tevilka: +UserInfoNameRequired=Vnos imena je obvezen. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Izbira ciljnega mesta +SelectDirDesc=Kam elite namestiti program [name]? +SelectDirLabel3=Program [name] bo nameen v naslednjo mapo. +SelectDirBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj. +DiskSpaceGBLabel=Na disku mora biti vsaj [gb] GB prostora. +DiskSpaceMBLabel=Na disku mora biti vsaj [mb] MB prostora. +CannotInstallToNetworkDrive=Programa ni mogoe namestiti na mreni pogon. +CannotInstallToUNCPath=Programa ni mogoe namestiti v UNC pot. +InvalidPath=Vpisati morate polno pot vkljuno z oznako pogona. Primer:%n%nC:\PROGRAM%n%nali UNC pot v obliki:%n%n\\strenik\mapa_skupne_rabe +InvalidDrive=Izbrani pogon ali omreno sredstvo UNC ne obstaja ali ni dostopno. Izberite drugega. +DiskSpaceWarningTitle=Na disku ni dovolj prostora +DiskSpaceWarning=Namestitev potrebuje vsaj %1 KB prostora, toda na izbranem pogonu je na voljo le %2 KB.%n%nelite kljub temu nadaljevati? +DirNameTooLong=Ime mape ali poti je predolgo. +InvalidDirName=Ime mape ni veljavno. +BadDirName32=Ime mape ne sme vsebovati naslednjih znakov:%n%n%1 +DirExistsTitle=Mapa e obstaja +DirExists=Mapa%n%n%1%n%ne obstaja. elite program vseeno namestiti v to mapo? +DirDoesntExistTitle=Mapa ne obstaja +DirDoesntExist=Mapa %n%n%1%n%nne obstaja. Ali jo elite ustvariti? + +; *** "Select Components" wizard page +WizardSelectComponents=Izbira komponent +SelectComponentsDesc=Katere komponente elite namestiti? +SelectComponentsLabel2=Oznaite komponente, ki jih elite namestiti; odznaite komponente, ki jih ne elite namestiti. Kliknite Naprej, ko boste pripravljeni za nadaljevanje. +FullInstallation=Popolna namestitev +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Osnovna namestitev +CustomInstallation=Namestitev po meri +NoUninstallWarningTitle=Komponente e obstajajo +NoUninstallWarning=Namestitveni program je ugotovil, da so naslednje komponente e nameene v raunalniku:%n%n%1%n%nNamestitveni program teh e nameenih komponent ne bo odstranil.%n%nelite vseeno nadaljevati? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Za izbrano namestitev potrebujete vsaj [gb] GB prostora na disku. +ComponentsDiskSpaceMBLabel=Za izbrano namestitev potrebujete vsaj [mb] MB prostora na disku. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Izbira dodatnih opravil +SelectTasksDesc=Katera dodatna opravila elite izvesti? +SelectTasksLabel2=Izberite dodatna opravila, ki jih bo namestitveni program opravil med namestitvijo programa [name], nato kliknite Naprej. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Izbira mape v meniju Zaetek +SelectStartMenuFolderDesc=Kje naj namestitveni program ustvari blinjice? +SelectStartMenuFolderLabel3=Namestitveni program bo ustvaril blinjice v naslednji mapi v meniju Start. +SelectStartMenuFolderBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj. +MustEnterGroupName=Ime skupine mora biti vpisano. +GroupNameTooLong=Ime mape ali poti je predolgo. +InvalidGroupName=Ime mape ni veljavno. +BadGroupName=Ime skupine ne sme vsebovati naslednjih znakov:%n%n%1 +NoProgramGroupCheck2=&Ne ustvari mape v meniju Start + +; *** "Ready to Install" wizard page +WizardReady=Pripravljen za namestitev +ReadyLabel1=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik. +ReadyLabel2a=Kliknite Namesti za zaetek nameanja. Kliknite Nazaj, e elite pregledati ali spremeniti katerokoli nastavitev. +ReadyLabel2b=Kliknite Namesti za zaetek nameanja. +ReadyMemoUserInfo=Podatki o uporabniku: +ReadyMemoDir=Ciljno mesto: +ReadyMemoType=Vrsta namestitve: +ReadyMemoComponents=Izbrane komponente: +ReadyMemoGroup=Mapa v meniju Zaetek: +ReadyMemoTasks=Dodatna opravila: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Prenaam dodatne datoteke... +ButtonStopDownload=Prekini preno&s +StopDownload=Ali res elite prekiniti prenos? +ErrorDownloadAborted=Prenos prekinjen +ErrorDownloadFailed=Prenos ni uspel: %1 %2 +ErrorDownloadSizeFailed=Pridobivanje velikosti ni uspelo: %1 %2 +ErrorFileHash1=Pridobivanje zgoene vrednosti ni uspelo: %1 +ErrorFileHash2=Neveljavna zgoena vrednost: priakovana %1, dobljena %2 +ErrorProgress=Neveljaven potek: %1 od %2 +ErrorFileSize=Neveljavna velikost datoteke: priakovana %1, dobljena %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Pripravljam za namestitev +PreparingDesc=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik. +PreviousInstallNotCompleted=Namestitev ali odstranitev prejnjega programa ni bila konana. Da bi jo dokonali, morate raunalnik znova zagnati.%n%nPo ponovnem zagonu raunalnika znova zaenite namestitveni program, da boste konali namestitev programa [name]. +CannotContinue=Namestitveni program ne more nadaljevati. Pritisnite Preklii za izhod. + +; *** "Installing" wizard page +ApplicationsFound=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona. +ApplicationsFound2=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona. Po koncu namestitve bo namestitveni program poizkusil znova zagnati te programe. +CloseApplications=S&amodejno zapri programe +DontCloseApplications=&Ne zapri programov +ErrorCloseApplications=Namestitvenemu programu ni uspelo samodejno zapreti vseh programov. Priporoljivo je, da pred nadaljevanjem zaprete vse programe, ki uporabljajo datoteke, katere mora namestitev posodobiti. +PrepareToInstallNeedsRestart=Namestitveni program mora znova zagnati va raunalnik. Za dokonanje namestitve programa [name], po ponovnem zagonu znova zaenite namestitveni program.%n%nAli elite zdaj znova zagnati raunalnik? + +WizardInstalling=Nameanje +InstallingLabel=Poakajte, da bo program [name] nameen v va raunalnik. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Zakljuek namestitve programa [name] +FinishedLabelNoIcons=Program [name] je nameen v va raunalnik. +FinishedLabel=Program [name] je nameen v va raunalnik. Program zaenete tako, da odprete pravkar ustvarjene programske ikone. +ClickFinish=Kliknite tipko Konaj za zakljuek namestitve. +FinishedRestartLabel=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. Ali ga elite znova zagnati zdaj? +FinishedRestartMessage=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. %n%nAli ga elite znova zagnati zdaj? +ShowReadmeCheck=elim prebrati datoteko BERIME +YesRadio=&Da, raunalnik znova zaeni zdaj +NoRadio=&Ne, raunalnik bom znova zagnal pozneje + +; used for example as 'Run MyProg.exe' +RunEntryExec=Zaeni %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Preglej %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=Namestitveni program potrebuje naslednji disk +SelectDiskLabel2=Vstavite disk %1 in kliknite V redu.%n%ne se datoteke s tega diska nahajajo v drugi mapi kot je navedena spodaj, vnesite pravilno pot ali kliknite Prebrskaj. +PathLabel=&Pot: +FileNotInDir2=Datoteke %1 ni v mapi %2. Vstavite pravilni disk ali izberite drugo mapo. +SelectDirectoryLabel=Vnesite mesto naslednjega diska. + +; *** Installation phase messages +SetupAborted=Namestitev ni bila konana.%n%nOdpravite teavo in znova odprite namestitveni program. +AbortRetryIgnoreSelectAction=Izberite dejanje +AbortRetryIgnoreRetry=Poizkusi &znova +AbortRetryIgnoreIgnore=&Prezri napako in nadaljuj +AbortRetryIgnoreCancel=Preklii namestitev + +; *** Installation status messages +StatusClosingApplications=Zapiranje programov... +StatusCreateDirs=Ustvarjanje map... +StatusExtractFiles=Razirjanje datotek... +StatusCreateIcons=Ustvarjanje blinjic... +StatusCreateIniEntries=Vpisovanje v INI datoteke... +StatusCreateRegistryEntries=Ustvarjanje vnosov v register... +StatusRegisterFiles=Registriranje datotek... +StatusSavingUninstall=Zapisovanje podatkov za odstranitev... +StatusRunProgram=Zakljuevanje namestitve... +StatusRestartingApplications=Zaganjanje programov... +StatusRollback=Obnavljanje prvotnega stanja... + +; *** Misc. errors +ErrorInternal2=Interna napaka: %1 +ErrorFunctionFailedNoCode=%1 ni uspel(a) +ErrorFunctionFailed=%1 ni uspel(a); koda %2 +ErrorFunctionFailedWithMessage=%1 ni uspela; koda %2.%n%3 +ErrorExecutingProgram=Ne morem zagnati programa:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Napaka pri odpiranju kljua v registru:%n%1\%2 +ErrorRegCreateKey=Napaka pri ustvarjanju kljua v registru:%n%1\%2 +ErrorRegWriteKey=Napaka pri pisanju kljua v registru:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Napaka pri vpisu v INI datoteko %1. + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=Pre&skoi to datoteko (ni priporoeno) +FileAbortRetryIgnoreIgnoreNotRecommended=Prezr&i napako in nadaljuj (ni priporoeno) +SourceIsCorrupted=Izvorna datoteka je okvarjena +SourceDoesntExist=Izvorna datoteka %1 ne obstaja +ExistingFileReadOnly2=Obstojee datoteke ni mogoe nadomestiti, ker ima oznako samo za branje. +ExistingFileReadOnlyRetry=Odst&rani oznako samo za branje in poizkusi ponovno +ExistingFileReadOnlyKeepExisting=&Ohrani obstojeo datoteko +ErrorReadingExistingDest=Pri branju obstojee datoteke je prilo do napake: +FileExistsSelectAction=Izberite dejanje +FileExists2=Datoteka e obstaja. +FileExistsOverwriteExisting=&Prepii obstojeo datoteko +FileExistsKeepExisting=&Ohrani trenutno datoteko +FileExistsOverwriteOrKeepAll=&To naredite za preostale spore +ExistingFileNewerSelectAction=Izberite dejanje +ExistingFileNewer2=Obstojea datoteka je noveja, kot datoteka, ki se namea. +ExistingFileNewerOverwriteExisting=&Prepii obstojeo datoteko +ExistingFileNewerKeepExisting=&Ohrani trenutno datoteko (priporoeno) +ExistingFileNewerOverwriteOrKeepAll=&To naredite za preostale spore +ErrorChangingAttr=Pri poskusu spremembe lastnosti datoteke je prilo do napake: +ErrorCreatingTemp=Pri ustvarjanju datoteke v ciljni mapi je prilo do napake: +ErrorReadingSource=Pri branju izvorne datoteke je prilo do napake: +ErrorCopying=Pri kopiranju datoteke je prilo do napake: +ErrorReplacingExistingFile=Pri poskusu zamenjave obstojee datoteke je prilo do napake: +ErrorRestartReplace=Napaka RestartReplace: +ErrorRenamingTemp=Pri poskusu preimenovanja datoteke v ciljni mapi je prilo do napake: +ErrorRegisterServer=Registracija DLL/OCX ni uspela: %1 +ErrorRegSvr32Failed=RegSvr32 ni uspel s kodo napake %1 +ErrorRegisterTypeLib=Registracija TypeLib ni uspela: %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bitno +UninstallDisplayNameMark64Bit=64-bitno +UninstallDisplayNameMarkAllUsers=vsi uporabniki +UninstallDisplayNameMarkCurrentUser=trenutni uporabnik + +; *** Post-installation errors +ErrorOpeningReadme=Pri odpiranju datoteke BERIME je prilo do napake. +ErrorRestartingComputer=Namestitvenemu programu ni uspelo znova zagnati raunalnika. Sami znova zaenite raunalnik. + +; *** Uninstaller messages +UninstallNotFound=Datoteka %1 ne obstaja. Odstranitev ni mogoa. +UninstallOpenError=Datoteke %1 ne morem odpreti. Ne morem odstraniti +UninstallUnsupportedVer=Dnevnika datoteka %1 je v obliki, ki je ta razliica odstranitvenega programa ne razume. Programa ni mogoe odstraniti +UninstallUnknownEntry=V dnevniki datoteki je bil najden neznani vpis (%1) +ConfirmUninstall=Ste prepriani, da elite v celoti odstraniti program %1 in pripadajoe komponente? +UninstallOnlyOnWin64=To namestitev je mogoe odstraniti le v 64-bitni razliici sistema Windows. +OnlyAdminCanUninstall=Za odstranitev tega programa morate imeti skrbnike pravice. +UninstallStatusLabel=Poakajte, da se program %1 odstrani iz vaega raunalnika. +UninstalledAll=Program %1 je bil uspeno odstranjen iz vaega raunalnika. +UninstalledMost=Odstranjevanje programa %1 je konano.%n%nNekatere datoteke niso bile odstranjene in jih lahko odstranite rono. +UninstalledAndNeedsRestart=Za dokonanje odstranitve programa %1 morate raunalnik znova zagnati.%n%nAli ga elite znova zagnati zdaj? +UninstallDataCorrupted=Datoteka %1 je okvarjena. Odstranitev ni mona + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=elite odstraniti datoteko v skupni rabi? +ConfirmDeleteSharedFile2=Spodaj izpisane datoteke v skupni rabi ne uporablja ve noben program. elite odstraniti to datoteko?%n%ne jo uporablja katerikoli program in jo boste odstranili, ta program verjetno ne bo ve deloval pravilno. e niste prepriani, kliknite Ne. e boste datoteko ohranili v raunalniku, ne bo ni narobe. +SharedFileNameLabel=Ime datoteke: +SharedFileLocationLabel=Mesto: +WizardUninstalling=Odstranjevanje programa +StatusUninstalling=Odstranjujem %1... + +ShutdownBlockReasonInstallingApp=Nameam %1. +ShutdownBlockReasonUninstallingApp=Odstranjujem %1. + +[CustomMessages] + +NameAndVersion=%1 razliica %2 +AdditionalIcons=Dodatne ikone: +CreateDesktopIcon=Ustvari ikono na &namizju +CreateQuickLaunchIcon=Ustvari ikono za &hitri zagon +ProgramOnTheWeb=%1 na spletu +UninstallProgram=Odstrani %1 +LaunchProgram=Odpri %1 +AssocFileExtension=&Povei %1 s pripono %2 +AssocingFileExtension=Povezujem %1 s pripono %2... +AutoStartProgramGroupDescription=Zagon: +AutoStartProgram=Samodejno zaeni %1 +AddonHostProgramNotFound=Programa %1 ni bilo mogoe najti v izbrani mapi.%n%nAli elite vseeno nadaljevati? diff --git a/installer/innosetup/Languages/Spanish.isl b/installer/innosetup/Languages/Spanish.isl new file mode 100644 index 000000000..6fff47c7b --- /dev/null +++ b/installer/innosetup/Languages/Spanish.isl @@ -0,0 +1,383 @@ +; *** Inno Setup version 6.1.0+ Spanish messages *** +; +; Maintained by Jorge Andres Brugger (jbrugger@ideaworks.com.ar) +; Spanish.isl version 1.5.2 (20211123) +; Default.isl version 6.1.0 +; +; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano, +; Ramn Verduzco, Graciela Garca, Carles Millan and Rafael Barranco-Droege + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Espa<00F1>ol +LanguageID=$0c0a +LanguageCodePage=1252 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=Instalar +SetupWindowTitle=Instalar - %1 +UninstallAppTitle=Desinstalar +UninstallAppFullTitle=Desinstalar - %1 + +; *** Misc. common +InformationTitle=Informacin +ConfirmTitle=Confirmar +ErrorTitle=Error + +; *** SetupLdr messages +SetupLdrStartupMessage=Este programa instalar %1. Desea continuar? +LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida +LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nError %2: %3 +SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. +SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa. +SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa. +InvalidParameter=Se ha utilizado un parmetro no vlido en la lnea de comandos:%n%n%1 +SetupAlreadyRunning=El programa de instalacin an est ejecutndose. +WindowsVersionNotSupported=Este programa no es compatible con la versin de Windows de su equipo. +WindowsServicePackRequired=Este programa requiere %1 Service Pack %2 o posterior. +NotOnThisPlatform=Este programa no se ejecutar en %1. +OnlyOnThisPlatform=Este programa debe ejecutarse en %1. +OnlyOnTheseArchitectures=Este programa solo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1 +WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior. +WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior. +AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa. +PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como miembro del grupo de Usuarios Avanzados para instalar este programa. +SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. +UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=Seleccin del Modo de Instalacin +PrivilegesRequiredOverrideInstruction=Seleccione el modo de instalacin +PrivilegesRequiredOverrideText1=%1 puede ser instalado para todos los usuarios (requiere privilegios administrativos), o solo para Ud. +PrivilegesRequiredOverrideText2=%1 puede ser instalado solo para Ud, o para todos los usuarios (requiere privilegios administrativos). +PrivilegesRequiredOverrideAllUsers=Instalar para &todos los usuarios +PrivilegesRequiredOverrideAllUsersRecommended=Instalar para &todos los usuarios (recomendado) +PrivilegesRequiredOverrideCurrentUser=Instalar para &m solamente +PrivilegesRequiredOverrideCurrentUserRecommended=Instalar para &m solamente (recomendado) + +; *** Misc. errors +ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1" +ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos + +; *** Setup common messages +ExitSetupTitle=Salir de la Instalacin +ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no se instalar.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin? +AboutSetupMenuItem=&Acerca de Instalar... +AboutSetupTitle=Acerca de Instalar +AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4 +AboutSetupNote= +TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net) + +; *** Buttons +ButtonBack=< &Atrs +ButtonNext=&Siguiente > +ButtonInstall=&Instalar +ButtonOK=Aceptar +ButtonCancel=Cancelar +ButtonYes=&S +ButtonYesToAll=S a &Todo +ButtonNo=&No +ButtonNoToAll=N&o a Todo +ButtonFinish=&Finalizar +ButtonBrowse=&Examinar... +ButtonWizardBrowse=&Examinar... +ButtonNewFolder=&Crear Nueva Carpeta + +; *** "Select Language" dialog messages +SelectLanguageTitle=Seleccione el Idioma de la Instalacin +SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin. + +; *** Common wizard text +ClickNext=Haga clic en Siguiente para continuar o en Cancelar para salir de la instalacin. +BeveledLabel= +BrowseDialogTitle=Buscar Carpeta +BrowseDialogLabel=Seleccione una carpeta y luego haga clic en Aceptar. +NewFolderName=Nueva Carpeta + +; *** "Welcome" wizard page +WelcomeLabel1=Bienvenido al asistente de instalacin de [name] +WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda cerrar todas las dems aplicaciones antes de continuar. + +; *** "Password" wizard page +WizardPassword=Contrasea +PasswordLabel1=Esta instalacin est protegida por contrasea. +PasswordLabel3=Por favor, introduzca la contrasea y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas. +PasswordEditLabel=&Contrasea: +IncorrectPassword=La contrasea introducida no es correcta. Por favor, intntelo nuevamente. + +; *** "License Agreement" wizard page +WizardLicense=Acuerdo de Licencia +LicenseLabel=Es importante que lea la siguiente informacin antes de continuar. +LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar las clusulas de este acuerdo antes de continuar con la instalacin. +LicenseAccepted=A&cepto el acuerdo +LicenseNotAccepted=&No acepto el acuerdo + +; *** "Information" wizard pages +WizardInfoBefore=Informacin +InfoBeforeLabel=Es importante que lea la siguiente informacin antes de continuar. +InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente. +WizardInfoAfter=Informacin +InfoAfterLabel=Es importante que lea la siguiente informacin antes de continuar. +InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente. + +; *** "User Information" wizard page +WizardUserInfo=Informacin de Usuario +UserInfoDesc=Por favor, introduzca sus datos. +UserInfoName=Nombre de &Usuario: +UserInfoOrg=&Organizacin: +UserInfoSerial=Nmero de &Serie: +UserInfoNameRequired=Debe introducir un nombre. + +; *** "Select Destination Location" wizard page +WizardSelectDir=Seleccione la Carpeta de Destino +SelectDirDesc=Dnde debe instalarse [name]? +SelectDirLabel3=El programa instalar [name] en la siguiente carpeta. +SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar. +DiskSpaceGBLabel=Se requieren al menos [gb] GB de espacio libre en el disco. +DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco. +CannotInstallToNetworkDrive=El programa de instalacin no puede realizar la instalacin en una unidad de red. +CannotInstallToUNCPath=El programa de instalacin no puede realizar la instalacin en una ruta de acceso UNC. +InvalidPath=Debe introducir una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido +InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra. +DiskSpaceWarningTitle=Espacio Insuficiente en Disco +DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada solo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas? +DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. +InvalidDirName=El nombre de la carpeta no es vlido. +BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1 +DirExistsTitle=La Carpeta Ya Existe +DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas? +DirDoesntExistTitle=La Carpeta No Existe +DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta? + +; *** "Select Components" wizard page +WizardSelectComponents=Seleccione los Componentes +SelectComponentsDesc=Qu componentes deben instalarse? +SelectComponentsLabel2=Seleccione los componentes que desea instalar y desmarque los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar. +FullInstallation=Instalacin Completa +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=Instalacin Compacta +CustomInstallation=Instalacin Personalizada +NoUninstallWarningTitle=Componentes Encontrados +NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalar.%n%nDesea continuar de todos modos? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=La seleccin actual requiere al menos [gb] GB de espacio en disco. +ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=Seleccione las Tareas Adicionales +SelectTasksDesc=Qu tareas adicionales deben realizarse? +SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio +SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa? +SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio. +SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar. +MustEnterGroupName=Debe proporcionar un nombre de carpeta. +GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos. +InvalidGroupName=El nombre de la carpeta no es vlido. +BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1 +NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio + +; *** "Ready to Install" wizard page +WizardReady=Listo para Instalar +ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema. +ReadyLabel2a=Haga clic en Instalar para continuar con el proceso o haga clic en Atrs si desea revisar o cambiar alguna configuracin. +ReadyLabel2b=Haga clic en Instalar para continuar con el proceso. +ReadyMemoUserInfo=Informacin del usuario: +ReadyMemoDir=Carpeta de Destino: +ReadyMemoType=Tipo de Instalacin: +ReadyMemoComponents=Componentes Seleccionados: +ReadyMemoGroup=Carpeta del Men Inicio: +ReadyMemoTasks=Tareas Adicionales: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Descargando archivos adicionales... +ButtonStopDownload=&Detener descarga +StopDownload=Est seguiro que desea detener la descarga? +ErrorDownloadAborted=Descarga cancelada +ErrorDownloadFailed=Fall descarga: %1 %2 +ErrorDownloadSizeFailed=Fall obtencin de tamao: %1 %2 +ErrorFileHash1=Fall hash del archivo: %1 +ErrorFileHash2=Hash de archivo no vlido: esperado %1, encontrado %2 +ErrorProgress=Progreso no vlido: %1 de %2 +ErrorFileSize=Tamao de archivo no vlido: esperado %1, encontrado %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=Preparndose para Instalar +PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema. +PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name]. +CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir. +ApplicationsFound=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. +ApplicationsFound2=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. Al completarse la instalacin, el programa de instalacin intentar reiniciar las aplicaciones. +CloseApplications=&Cerrar automticamente las aplicaciones +DontCloseApplications=&No cerrar las aplicaciones +ErrorCloseApplications=El programa de instalacin no pudo cerrar de forma automtica todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalacin. +PrepareToInstallNeedsRestart=El programa de instalacin necesita reiniciar el sistema. Una vez que se haya reiniciado ejecute nuevamente el programa de instalacin para completar la instalacin de [name].%n%nDesea reiniciar el sistema ahora? + +; *** "Installing" wizard page +WizardInstalling=Instalando +InstallingLabel=Por favor, espere mientras se instala [name] en su sistema. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=Completando la instalacin de [name] +FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema. +FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin utilizando los accesos directos creados. +ClickFinish=Haga clic en Finalizar para salir del programa de instalacin. +FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora? +FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? +ShowReadmeCheck=S, deseo ver el archivo LAME +YesRadio=&S, deseo reiniciar el sistema ahora +NoRadio=&No, reiniciar el sistema ms tarde +; used for example as 'Run MyProg.exe' +RunEntryExec=Ejecutar %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=Ver %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco +SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar. +PathLabel=&Ruta: +FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta. +SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco. + +; *** Installation phase messages +SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin. +AbortRetryIgnoreSelectAction=Seleccione accin +AbortRetryIgnoreRetry=&Reintentar +AbortRetryIgnoreIgnore=&Ignorar el error y continuar +AbortRetryIgnoreCancel=Cancelar instalacin + +; *** Installation status messages +StatusClosingApplications=Cerrando aplicaciones... +StatusCreateDirs=Creando carpetas... +StatusExtractFiles=Extrayendo archivos... +StatusCreateIcons=Creando accesos directos... +StatusCreateIniEntries=Creando entradas INI... +StatusCreateRegistryEntries=Creando entradas de registro... +StatusRegisterFiles=Registrando archivos... +StatusSavingUninstall=Guardando informacin para desinstalar... +StatusRunProgram=Terminando la instalacin... +StatusRestartingApplications=Reiniciando aplicaciones... +StatusRollback=Deshaciendo cambios... + +; *** Misc. errors +ErrorInternal2=Error interno: %1 +ErrorFunctionFailedNoCode=%1 fall +ErrorFunctionFailed=%1 fall; cdigo %2 +ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3 +ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1 + +; *** Registry errors +ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2 +ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2 +ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2 + +; *** INI errors +ErrorIniEntry=Error al crear entrada INI en el archivo "%1". + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&Omitir este archivo (no recomendado) +FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorar el error y continuar (no recomendado) +SourceIsCorrupted=El archivo de origen est daado +SourceDoesntExist=El archivo de origen "%1" no existe +ExistingFileReadOnly2=El archivo existente no puede ser reemplazado debido a que est marcado como solo-lectura. +ExistingFileReadOnlyRetry=&Elimine el atributo de solo-lectura y reintente +ExistingFileReadOnlyKeepExisting=&Mantener el archivo existente +ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo: +FileExistsSelectAction=Seleccione accin +FileExists2=El archivo ya existe. +FileExistsOverwriteExisting=&Sobreescribir el archivo existente +FileExistsKeepExisting=&Mantener el archivo existente +FileExistsOverwriteOrKeepAll=&Hacer lo mismo para lo siguientes conflictos +ExistingFileNewerSelectAction=Seleccione accin +ExistingFileNewer2=El archivo existente es ms reciente que el que se est tratando de instalar. +ExistingFileNewerOverwriteExisting=&Sobreescribir el archivo existente +ExistingFileNewerKeepExisting=&Mantener el archivo existente (recomendado) +ExistingFileNewerOverwriteOrKeepAll=&Hacer lo mismo para lo siguientes conflictos +ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo: +ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino: +ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen: +ErrorCopying=Ocurri un error al intentar copiar el archivo: +ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente: +ErrorRestartReplace=Fall reintento de reemplazar: +ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino: +ErrorRegisterServer=Imposible registrar el DLL/OCX: %1 +ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1 +ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=Todos los usuarios +UninstallDisplayNameMarkCurrentUser=Usuario actual + +; *** Post-installation errors +ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME. +ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente. + +; *** Uninstaller messages +UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar. +UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar +UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar +UninstallUnknownEntry=Se encontr una entrada desconocida (%1) en el registro de desinstalacin +ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes? +UninstallOnlyOnWin64=Este programa solo puede ser desinstalado en Windows de 64-bits. +OnlyAdminCanUninstall=Este programa solo puede ser desinstalado por un usuario con privilegios administrativos. +UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema. +UninstalledAll=%1 se desinstal satisfactoriamente de su sistema. +UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse, pero podr eliminarlos manualmente si lo desea. +UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora? +UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido? +ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es utilizado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi elimina el archivo y hay programas que lo utilizan, esos programas podran dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao. +SharedFileNameLabel=Archivo: +SharedFileLocationLabel=Ubicacin: +WizardUninstalling=Estado de la Desinstalacin +StatusUninstalling=Desinstalando %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=Instalando %1. +ShutdownBlockReasonUninstallingApp=Desinstalando %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 versin %2 +AdditionalIcons=Accesos directos adicionales: +CreateDesktopIcon=Crear un acceso directo en el &escritorio +CreateQuickLaunchIcon=Crear un acceso directo en &Inicio Rpido +ProgramOnTheWeb=%1 en la Web +UninstallProgram=Desinstalar %1 +LaunchProgram=Ejecutar %1 +AssocFileExtension=&Asociar %1 con la extensin de archivo %2 +AssocingFileExtension=Asociando %1 con la extensin de archivo %2... +AutoStartProgramGroupDescription=Inicio: +AutoStartProgram=Iniciar automticamente %1 +AddonHostProgramNotFound=%1 no pudo ser localizado en la carpeta seleccionada.%n%nDesea continuar de todas formas? diff --git a/installer/innosetup/Languages/Swedish.isl b/installer/innosetup/Languages/Swedish.isl index f89324798..f458ca651 100644 --- a/installer/innosetup/Languages/Swedish.isl +++ b/installer/innosetup/Languages/Swedish.isl @@ -1,4 +1,4 @@ -; *** Inno Setup version 6.0.0+ Swedish messages *** +; *** Inno Setup version 6.1.0+ Swedish messages *** ; ; To download user-contributed translations of this file, go to: ; http://www.jrsoftware.org/files/istrans/ @@ -151,6 +151,9 @@ IncorrectPassword=L ; *** "License Agreement" wizard page + + + WizardLicense=Licensavtal LicenseLabel=Var god och ls fljande viktiga information innan du fortstter. LicenseLabel3=Var god och ls fljande licensavtal. Du mste acceptera villkoren i avtalet innan du kan fortstta med installationen. @@ -160,6 +163,9 @@ LicenseNotAccepted=Jag accepterar &inte avtalet ; *** "Information" wizard pages + + + WizardInfoBefore=Information InfoBeforeLabel=Var god ls fljande viktiga information innan du fortstter. InfoBeforeClickLabel=Nr du r klar att fortstta med installationen klickar du p Nsta. @@ -170,6 +176,9 @@ InfoAfterClickLabel=N ; *** "User Information" wizard page + + + WizardUserInfo=Anvndarinformation UserInfoDesc=Var god och fyll i fljande uppgifter. UserInfoName=&Namn: @@ -180,10 +189,14 @@ UserInfoNameRequired=Du m ; *** "Select Destination Directory" wizard page + + + WizardSelectDir=Vlj installationsplats SelectDirDesc=Var skall [name] installeras? SelectDirLabel3=Installationsprogrammet kommer att installera [name] i fljande katalog SelectDirBrowseLabel=Fr att fortstta klickar du p Nsta. Om du vill vlja en annan katalog klickar du p Blddra. +DiskSpaceGBLabel=Programmet krver minst [gb] MB hrddiskutrymme. DiskSpaceMBLabel=Programmet krver minst [mb] MB hrddiskutrymme. CannotInstallToNetworkDrive=Setup kan inte installeras p ntverksdisk. CannotInstallToUNCPath=Setup kan inte installeras p UNC skvg. @@ -202,6 +215,9 @@ DirDoesntExist=Katalogen:%n%n%1%n%nfinns inte. Vill du skapa den? ; *** "Select Components" wizard page + + + WizardSelectComponents=Vlj komponenter SelectComponentsDesc=Vilka komponenter skall installeras? SelectComponentsLabel2=Vlj de komponenter som du vill ska installeras; avmarkera de komponenter som du inte vill ha. Klicka sedan p Nsta nr du r klar att fortstta. @@ -209,17 +225,24 @@ FullInstallation=Fullst ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) + + + CompactInstallation=Kompakt installation CustomInstallation=Anpassad installation NoUninstallWarningTitle=Komponenter finns NoUninstallWarning=Installationsprogrammet har upptckt att fljande komponenter redan finns installerade p din dator:%n%n%1%n%nAtt avmarkera dessa komponenter kommer inte att avinstallera dom.%n%nVill du fortstta nd? ComponentSize1=%1 KB ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Aktuella val krver minst [gb] GB diskutrymme. ComponentsDiskSpaceMBLabel=Aktuella val krver minst [mb] MB diskutrymme. ; *** "Select Additional Tasks" wizard page + + + WizardSelectTasks=Vlj extra uppgifter SelectTasksDesc=Vilka extra uppgifter skall utfras? SelectTasksLabel2=Markera ytterligare uppgifter att utfra vid installation av [name], tryck sedan p Nsta. @@ -227,6 +250,9 @@ SelectTasksLabel2=Markera ytterligare uppgifter att utf ; *** "Select Start Menu Folder" wizard page + + + WizardSelectProgramGroup=Vlj Startmenykatalogen SelectStartMenuFolderDesc=Var skall installationsprogrammet placera programmets genvgar? SelectStartMenuFolderLabel3=Installationsprogrammet kommer att skapa programmets genvgar i fljande katalog. @@ -240,6 +266,9 @@ NoProgramGroupCheck2=&Skapa ingen Startmenykatalog ; *** "Ready to Install" wizard page + + + WizardReady=Redo att installera ReadyLabel1=Installationsprogrammet r nu redo att installera [name] p din dator. ReadyLabel2a=Tryck p Installera om du vill fortstta, eller p g Tillbaka om du vill granska eller ndra p ngot. @@ -250,10 +279,23 @@ ReadyMemoType=Installationstyp: ReadyMemoComponents=Valda komponenter: ReadyMemoGroup=Startmenykatalog: ReadyMemoTasks=Extra uppgifter: +DownloadingLabel=Laddar ner ytterligare filer... +ButtonStopDownload=&Stoppa nedladdning +StopDownload=r du sker p att du vill stoppa nedladdningen? +ErrorDownloadAborted=Nedladdningen avbruten +ErrorDownloadFailed=Nedladdningen misslyckades: %1 %2 +ErrorDownloadSizeFailed=F storlek misslyckades: %1 %2 +ErrorFileHash1=Filhash misslyckades: %1 +ErrorFileHash2=Ogiltig filhash: frvntat %1, hittat %2 +ErrorProgress=Ogiltig framfart: %1 of %2 +ErrorFileSize=Ogiltig filstorlek: frvntad %1, hittad %2 ; *** "Preparing to Install" wizard page + + + WizardPreparing=Frbereder installationen PreparingDesc=Installationsprogrammet frbereder installationen av [name] p din dator. PreviousInstallNotCompleted=Installationen/avinstallationen av ett tidigare program har inte slutfrts. Du mste starta om datorn fr att avsluta den installationen.%n%nEfter att ha startat om datorn kr du installationsprogrammet igen fr att slutfra installationen av [name]. @@ -263,16 +305,23 @@ ApplicationsFound2=F CloseApplications=&Stng programmen automatiskt DontCloseApplications=&Stng inte programmen ErrorCloseApplications=Installationsprogrammet kunde inte stnga alla program. Innan installationen fortstter rekommenderar vi att du stnger alla program som anvnder filer som Setup behver uppdatera. +PrepareToInstallNeedsRestart=Installationen mste starta om din dator. Nr du har startat om datorn kr du Setup igen fr att slutfra installationen av [name].%n%nVill du starta om nu? ; *** "Installing" wizard page + + + WizardInstalling=Installerar InstallingLabel=Vnta medan [name] installeras p din dator. ; *** "Setup Completed" wizard page + + + FinishedHeadingLabel=Avslutar installationen av [name] FinishedLabelNoIcons=[name] har nu installerats p din dator. FinishedLabel=[name] har nu installerats p din dator. Programmet kan startas genom att vlja ngon av ikonerna. @@ -285,15 +334,24 @@ NoRadio=&Nej, jag startar sj ; used for example as 'Run MyProg.exe' + + + RunEntryExec=Kr %1 ; used for example as 'View Readme.txt' + + + RunEntryShellExec=Ls %1 ; *** "Setup Needs the Next Disk" stuff + + + ChangeDiskTitle=Installationsprogrammet behver nsta diskett SelectDiskLabel2=Var god stt i diskett %1 och tryck OK.%n%nOm filerna kan hittas i en annan katalog n den som visas nedan, skriv in rtt skvg eller vlj Blddra. PathLabel=&Skvg: @@ -303,6 +361,9 @@ SelectDirectoryLabel=Var god ange s ; *** Installation phase messages + + + SetupAborted=Installationen slutfrdes inte.%n%nVar god rtta till felet och kr installationen igen. AbortRetryIgnoreSelectAction=Vlj tgrd AbortRetryIgnoreRetry=&Frsk igen @@ -312,6 +373,9 @@ AbortRetryIgnoreCancel=Avbryt installationen ; *** Installation status messages + + + StatusClosingApplications=Stnger program... StatusCreateDirs=Skapar kataloger... StatusExtractFiles=Packar upp filer... @@ -327,6 +391,9 @@ StatusRollback= ; *** Misc. errors + + + ErrorInternal2=Internt fel: %1 ErrorFunctionFailedNoCode=%1 misslyckades ErrorFunctionFailed=%1 misslyckades; kod %2 @@ -336,6 +403,9 @@ ErrorExecutingProgram=Kan inte k ; *** Registry errors + + + ErrorRegOpenKey=Fel vid ppning av registernyckel:%n%1\%2 ErrorRegCreateKey=Kan ej skapa registernyckel:%n%1\%2 ErrorRegWriteKey=Kan ej skriva till registernyckel:%n%1\%2 @@ -343,6 +413,9 @@ ErrorRegWriteKey=Kan ej skriva till registernyckel:%n%1\%2 ; *** INI errors + + + ErrorIniEntry=Kan inte skriva nytt INI-vrde i filen "%1". FileAbortRetryIgnoreSkipNotRecommended=&Hoppa ver den hr filen (rekommenderas inte) FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorera felet och fortstt (rekommenderas inte) @@ -352,8 +425,16 @@ ExistingFileReadOnly2=Den befintliga filen kunde inte bytas ut eftersom den ExistingFileReadOnlyRetry=&Ta bort skrivskyddad attributet och frsk igen ExistingFileReadOnlyKeepExisting=&Behll den befintliga filen ErrorReadingExistingDest=Ett fel uppstod vid frsk att lsa den befintliga filen: -FileExists=Filen finns redan.%n%nVill du skriva ver den? -ExistingFileNewer=Den befintliga filen r nyare n den som ska installeras. Du rekommenderas att behlla den befintliga filen. %n%nVill Du behlla den befintliga filen? +FileExistsSelectAction=Vlj tgrd +FileExists2=Filen finns redan. +FileExistsOverwriteExisting=&Skriv ver den befintliga filen +FileExistsKeepExisting=&Behll befintlig fil +FileExistsOverwriteOrKeepAll=&Gr detta fr nsta konflikt +ExistingFileNewerSelectAction=Vlj tgrd +ExistingFileNewer2=Den befintliga filen r nyare n den som Setup frsker installera. +ExistingFileNewerOverwriteExisting=&Skriv ver den befintliga filen +ExistingFileNewerKeepExisting=&Behll befintlig fil (rekommenderas) +ExistingFileNewerOverwriteOrKeepAll=&Gr detta fr nsta konflikt ErrorChangingAttr=Ett fel uppstod vid frsk att ndra attribut p den befintliga filen: ErrorCreatingTemp=Ett fel uppstod vid ett frsk att skapa installationskatalogen: ErrorReadingSource=Ett fel uppstod vid ett frsk att lsa kllfilen: @@ -374,12 +455,18 @@ UninstallDisplayNameMarkCurrentUser=Nuvarande anv ; *** Post-installation errors + + + ErrorOpeningReadme=Ett fel uppstod vid ppnandet av LS MIG-filen. ErrorRestartingComputer=Installationsprogrammet kunde inte starta om datorn. Var god gr det manuellt. ; *** Uninstaller messages + + + UninstallNotFound=Filen "%1" finns inte. Kan inte avinstallera. UninstallOpenError=Filen "%1" kan inte ppnas. Kan inte avinstallera. UninstallUnsupportedVer=Avinstallationsloggen "%1" r i ett format som denna version inte knner igen. Kan ej avinstallera @@ -396,6 +483,9 @@ UninstallDataCorrupted=Filen "%1" ; *** Uninstallation phase messages + + + ConfirmDeleteSharedFileTitle=Ta bort delad fil? ConfirmDeleteSharedFile2=Systemet indikerar att fljande delade fil inte lngre anvnds av ngra program. Vill du ta bort den delade filen?%n%n%1%n%nOm ngot program fortfarande anvnder denna fil och den raderas, kommer programmet kanske att sluta fungera. Om du r osker, vlj Nej. Att lta filen ligga kvar i systemet kommer inte att orsaka ngon skada. SharedFileNameLabel=Filnamn: @@ -406,6 +496,9 @@ StatusUninstalling=Avinstallerar %1... ; *** Shutdown block reasons + + + ShutdownBlockReasonInstallingApp=Installerar %1. ShutdownBlockReasonUninstallingApp=Avinstallerar %1. @@ -415,11 +508,14 @@ ShutdownBlockReasonUninstallingApp=Avinstallerar %1. + + + [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=terstende ikoner: -CreateDesktopIcon=Skapa en ikon p skrivbordet -CreateQuickLaunchIcon=Skapa en ikon i Snabbstartfltet +CreateDesktopIcon=Skapa en genvg p skrivbordet +CreateQuickLaunchIcon=Skapa en genvg i Snabbstartfltet ProgramOnTheWeb=%1 p Webben UninstallProgram=Avinstallera %1 LaunchProgram=Starta %1 diff --git a/installer/innosetup/Languages/Turkish.isl b/installer/innosetup/Languages/Turkish.isl new file mode 100644 index 000000000..932c705bd --- /dev/null +++ b/installer/innosetup/Languages/Turkish.isl @@ -0,0 +1,384 @@ +; *** Inno Setup version 6.1.0+ Turkish messages *** +; Language "Turkce" Turkish Translate by "Ceviren" Kaya Zeren translator@zeron.net +; To download user-contributed translations of this file, go to: +; https://www.jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=T<00FC>rk<00E7>e +LanguageID=$041f +LanguageCodePage=1254 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** Uygulama balklar +SetupAppTitle=Kurulum Yardmcs +SetupWindowTitle=%1 - Kurulum Yardmcs +UninstallAppTitle=Kaldrma Yardmcs +UninstallAppFullTitle=%1 Kaldrma Yardmcs + +; *** eitli ortak metinler +InformationTitle=Bilgi +ConfirmTitle=Onay +ErrorTitle=Hata + +; *** Kurulum ykleyici iletileri +SetupLdrStartupMessage=%1 uygulamas kurulacak. Devam etmek istiyor musunuz? +LdrCannotCreateTemp=Geici dosya oluturulamadndan kurulum iptal edildi +LdrCannotExecTemp=Geici klasrdeki dosya altrlamadndan kurulum iptal edildi +HelpTextNote= + +; *** Balang hata iletileri +LastErrorMessage=%1.%n%nHata %2: %3 +SetupFileMissing=Kurulum klasrnde %1 dosyas eksik. Ltfen sorunu zn ya da uygulamann yeni bir kopyasyla yeniden deneyin. +SetupFileCorrupt=Kurulum dosyalar bozulmu. Ltfen uygulamann yeni bir kopyasyla yeniden kurmay deneyin. +SetupFileCorruptOrWrongVer=Kurulum dosyalar bozulmu ya da bu kurulum yardmcs srm ile uyumlu deil. Ltfen sorunu zn ya da uygulamann yeni bir kopyasyla yeniden kurmay deneyin. +InvalidParameter=Komut satrnda geersiz bir parametre yazlm:%n%n%1 +SetupAlreadyRunning=Kurulum yardmcs zaten alyor. +WindowsVersionNotSupported=Bu uygulama, bilgisayarnzda ykl olan Windows srm ile uyumlu deil. +WindowsServicePackRequired=Bu uygulama, %1 Hizmet Paketi %2 ve zerindeki srmler ile alr. +NotOnThisPlatform=Bu uygulama, %1 zerinde almaz. +OnlyOnThisPlatform=Bu uygulama, %1 zerinde altrlmaldr. +OnlyOnTheseArchitectures=Bu uygulama, yalnz u ilemci mimarileri iin tasarlanm Windows srmleriyle alr:%n%n%1 +WinVersionTooLowError=Bu uygulama iin %1 srm %2 ya da zeri gereklidir. +WinVersionTooHighError=Bu uygulama, '%1' srm '%2' ya da zerine kurulamaz. +AdminPrivilegesRequired=Bu uygulamay kurmak iin Ynetici olarak oturum alm olmas gereklidir. +PowerUserPrivilegesRequired=Bu uygulamay kurarken, Ynetici ya da Gl Kullanclar grubunun bir yesi olarak oturum alm olmas gereklidir. +SetupAppRunningError=Kurulum yardmcs %1 uygulamasnn almakta olduunu alglad.%n%nLtfen uygulamann alan tm kopyalarn kapatp, devam etmek iin Tamam, kurulum yardmcsndan kmak iin ptal zerine tklayn. +UninstallAppRunningError=Kaldrma yardmcs, %1 uygulamasnn almakta olduunu alglad.%n%nLtfen uygulamann alan tm kopyalarn kapatp, devam etmek iin Tamam ya da kaldrma yardmcsndan kmak iin ptal zerine tklayn. + +; *** Balang sorular +PrivilegesRequiredOverrideTitle=Kurulum Kipini Sein +PrivilegesRequiredOverrideInstruction=Kurulum kipini sein +PrivilegesRequiredOverrideText1=%1 tm kullanclar iin (ynetici izinleri gerekir) ya da yalnz sizin hesabnz iin kurulabilir. +PrivilegesRequiredOverrideText2=%1 yalnz sizin hesabnz iin ya da tm kullanclar iin (ynetici izinleri gerekir) kurulabilir. +PrivilegesRequiredOverrideAllUsers=&Tm kullanclar iin kurulsun +PrivilegesRequiredOverrideAllUsersRecommended=&Tm kullanclar iin kurulsun (nerilir) +PrivilegesRequiredOverrideCurrentUser=&Yalnz benim kullancm iin kurulsun +PrivilegesRequiredOverrideCurrentUserRecommended=&Yalnz benim kullancm iin kurulsun (nerilir) + +; *** eitli hata metinleri +ErrorCreatingDir=Kurulum yardmcs "%1" klasrn oluturamad. +ErrorTooManyFilesInDir="%1" klasr iinde ok sayda dosya olduundan bir dosya oluturulamad + +; *** Ortak kurulum iletileri +ExitSetupTitle=Kurulum Yardmcsndan k +ExitSetupMessage=Kurulum tamamlanmad. imdi karsanz, uygulama kurulmayacak.%n%nKurulumu tamamlamak iin istediiniz zaman kurulum yardmcsn yeniden altrabilirsiniz.%n%nKurulum yardmcsndan klsn m? +AboutSetupMenuItem=Kurulum H&akknda... +AboutSetupTitle=Kurulum Hakknda +AboutSetupMessage=%1 %2 srm%n%3%n%n%1 ana sayfa:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Dmeler +ButtonBack=< &nceki +ButtonNext=&Sonraki > +ButtonInstall=&Kur +ButtonOK=Tamam +ButtonCancel=ptal +ButtonYes=E&vet +ButtonYesToAll=&Tmne Evet +ButtonNo=&Hayr +ButtonNoToAll=Tmne Ha&yr +ButtonFinish=&Bitti +ButtonBrowse=&Gzat... +ButtonWizardBrowse=Gza&t... +ButtonNewFolder=Ye&ni Klasr Olutur + +; *** "Kurulum Dilini Sein" sayfas iletileri +SelectLanguageTitle=Kurulum Yardmcs Dilini Sein +SelectLanguageLabel=Kurulum sresince kullanlacak dili sein. + +; *** Ortak metinler +ClickNext=Devam etmek iin Sonraki, kmak iin ptal zerine tklayn. +BeveledLabel= +BrowseDialogTitle=Klasre Gzat +BrowseDialogLabel=Aadaki listeden bir klasr seip, Tamam zerine tklayn. +NewFolderName=Yeni Klasr + +; *** "Ho geldiniz" sayfas +WelcomeLabel1=[name] Kurulum Yardmcsna Hogeldiniz. +WelcomeLabel2=Bilgisayarnza [name/ver] uygulamas kurulacak.%n%nDevam etmeden nce alan dier tm uygulamalar kapatmanz nerilir. + +; *** "Parola" sayfas +WizardPassword=Parola +PasswordLabel1=Bu kurulum parola korumaldr. +PasswordLabel3=Ltfen parolay yazn ve devam etmek iin Sonraki zerine tklayn. Parolalar byk kk harflere duyarldr. +PasswordEditLabel=&Parola: +IncorrectPassword=Yazdnz parola doru deil. Ltfen yeniden deneyin. + +; *** "Lisans Anlamas" sayfas +WizardLicense=Lisans Anlamas +LicenseLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun. +LicenseLabel3=Ltfen Aadaki Lisans Anlamasn okuyun. Kuruluma devam edebilmek iin bu anlamay kabul etmelisiniz. +LicenseAccepted=Anlamay kabul &ediyorum. +LicenseNotAccepted=Anlamay kabul et&miyorum. + +; *** "Bilgiler" sayfas +WizardInfoBefore=Bilgiler +InfoBeforeLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun. +InfoBeforeClickLabel=Kuruluma devam etmeye hazr olduunuzda Sonraki zerine tklayn. +WizardInfoAfter=Bilgiler +InfoAfterLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun. +InfoAfterClickLabel=Kuruluma devam etmeye hazr olduunuzda Sonraki zerine tklayn. + +; *** "Kullanc Bilgileri" sayfas +WizardUserInfo=Kullanc Bilgileri +UserInfoDesc=Ltfen bilgilerinizi yazn. +UserInfoName=K&ullanc Ad: +UserInfoOrg=Ku&rum: +UserInfoSerial=&Seri Numaras: +UserInfoNameRequired=Bir ad yazmalsnz. + +; *** "Hedef Konumunu Sein" sayfas +WizardSelectDir=Hedef Konumunu Sein +SelectDirDesc=[name] nereye kurulsun? +SelectDirLabel3=[name] uygulamas u klasre kurulacak. +SelectDirBrowseLabel=Devam etmek icin Sonraki zerine tklayn. Farkl bir klasr semek iin Gzat zerine tklayn. +DiskSpaceGBLabel=En az [gb] GB bo disk alan gereklidir. +DiskSpaceMBLabel=En az [mb] MB bo disk alan gereklidir. +CannotInstallToNetworkDrive=Uygulama bir a srcs zerine kurulamaz. +CannotInstallToUNCPath=Uygulama bir UNC yolu zerine (\\yol gibi) kurulamaz. +InvalidPath=Src ad ile tam yolu yazmalsnz; rnein: %n%nC:\APP%n%n ya da u ekilde bir UNC yolu:%n%n\\sunucu\paylam +InvalidDrive=Src ya da UNC paylam yok ya da eriilemiyor. Ltfen baka bir tane sein. +DiskSpaceWarningTitle=Yeterli Bo Disk Alan Yok +DiskSpaceWarning=Kurulum iin %1 KB bo alan gerekli, ancak seilmi srcde yalnz %2 KB bo alan var.%n%nGene de devam etmek istiyor musunuz? +DirNameTooLong=Klasr ad ya da yol ok uzun. +InvalidDirName=Klasr ad geersiz. +BadDirName32=Klasr adlarnda u karakterler bulunamaz:%n%n%1 +DirExistsTitle=Klasr Zaten Var" +DirExists=Klasr:%n%n%1%n%zaten var. Kurulum iin bu klasr kullanmak ister misiniz? +DirDoesntExistTitle=Klasr Bulunamad +DirDoesntExist=Klasr:%n%n%1%n%nbulunamad.Klasrn oluturmasn ister misiniz? + +; *** "Bileenleri Sein" sayfas +WizardSelectComponents=Bileenleri Sein +SelectComponentsDesc=Hangi bileenler kurulacak? +SelectComponentsLabel2=Kurmak istediiniz bileenleri sein; kurmak istemediiniz bileenlerin iaretini kaldrn. Devam etmeye hazr olduunuzda Sonraki zerine tklayn. +FullInstallation=Tam Kurulum +; Mmknse 'Compact' ifadesini kendi dilinizde 'Minimal' anlamnda evirmeyin +CompactInstallation=Normal kurulum +CustomInstallation=zel kurulum +NoUninstallWarningTitle=Bileenler Zaten Var +NoUninstallWarning=u bileenlerin bilgisayarnzda zaten kurulu olduu algland:%n%n%1%n%n Bu bileenlerin iaretlerinin kaldrlmas bileenleri kaldrmaz.%n%nGene de devam etmek istiyor musunuz? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=Seili bileenler iin diskte en az [gb] GB bo alan bulunmas gerekli. +ComponentsDiskSpaceMBLabel=Seili bileenler iin diskte en az [mb] MB bo alan bulunmas gerekli. + +; *** "Ek lemleri Sein" sayfas +WizardSelectTasks=Ek lemleri Sein +SelectTasksDesc=Baka hangi ilemler yaplsn? +SelectTasksLabel2=[name] kurulumu srasnda yaplmasn istediiniz ek ileri sein ve Sonraki zerine tklayn. + +; *** "Balat Mens Klasrn Sein" sayfas +WizardSelectProgramGroup=Balat Mens Klasrn Sein +SelectStartMenuFolderDesc=Uygulamann ksayollar nereye eklensin? +SelectStartMenuFolderLabel3=Kurulum yardmcs uygulama ksayollarn aadaki Balat Mens klasrne ekleyecek. +SelectStartMenuFolderBrowseLabel=Devam etmek iin Sonraki zerine tklayn. Farkl bir klasr semek iin Gzat zerine tklayn. +MustEnterGroupName=Bir klasr ad yazmalsnz. +GroupNameTooLong=Klasr ad ya da yol ok uzun. +InvalidGroupName=Klasr ad geersiz. +BadGroupName=Klasr adnda u karakterler bulunamaz:%n%n%1 +NoProgramGroupCheck2=Balat Mens klasr &oluturulmasn + +; *** "Kurulmaya Hazr" sayfas +WizardReady=Kurulmaya Hazr +ReadyLabel1=[name] bilgisayarnza kurulmaya hazr. +ReadyLabel2a=Kuruluma devam etmek iin Sonraki zerine, ayarlar gzden geirip deitirmek iin nceki zerine tklayn. +ReadyLabel2b=Kuruluma devam etmek iin Sonraki zerine tklayn. +ReadyMemoUserInfo=Kullanc bilgileri: +ReadyMemoDir=Hedef konumu: +ReadyMemoType=Kurulum tr: +ReadyMemoComponents=Seilmi bileenler: +ReadyMemoGroup=Balat Mens klasr: +ReadyMemoTasks=Ek ilemler: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=Ek dosyalar indiriliyor... +ButtonStopDownload=ndirmeyi &durdur +StopDownload=ndirmeyi durdurmak istediinize emin misiniz? +ErrorDownloadAborted=ndirme durduruldu +ErrorDownloadFailed=ndirilemedi: %1 %2 +ErrorDownloadSizeFailed=Boyut alnamad: %1 %2 +ErrorFileHash1=Dosya karmas dorulanamad: %1 +ErrorFileHash2=Dosya karmas geersiz: %1 olmas gerekirken %2 +ErrorProgress=Adm geersiz: %1 / %2 +ErrorFileSize=Dosya boyutu geersiz: %1 olmas gerekirken %2 + +; *** "Kuruluma Hazrlanlyor" sayfas +WizardPreparing=Kuruluma Hazrlanlyor +PreparingDesc=[name] bilgisayarnza kurulmaya hazrlanyor. +PreviousInstallNotCompleted=nceki uygulama kurulumu ya da kaldrlmas tamamlanmam. Bu kurulumun tamamlanmas iin bilgisayarnz yeniden balatmalsnz.%n%nBilgisayarnz yeniden balattktan sonra ilemi tamamlamak iin [name] kurulum yardmcsn yeniden altrn. +CannotContinue=Kuruluma devam edilemiyor. kmak iin ptal zerine tklayn. +ApplicationsFound=Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar, u uygulamalar tarafndan kullanyor. Kurulum yardmcsnn bu uygulamalar otomatik olarak kapatmasna izin vermeniz nerilir. +ApplicationsFound2=Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar, u uygulamalar tarafndan kullanyor. Kurulum yardmcsnn bu uygulamalar otomatik olarak kapatmasna izin vermeniz nerilir. Kurulum tamamlandktan sonra, uygulamalar yeniden balatlmaya allacak. +CloseApplications=&Uygulamalar kapatlsn +DontCloseApplications=Uygulamalar &kapatlmasn +ErrorCloseApplications=Kurulum yardmcs uygulamalar kapatamad. Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar kullanan uygulamalar el ile kapatmanz nerilir. +PrepareToInstallNeedsRestart=Kurulum iin bilgisayarn yeniden balatlmas gerekiyor. Bilgisayar yeniden balattktan sonra [name] kurulumunu tamamlamak iin kurulum yardmcsn yeniden altrn.%n%nBilgisayar imdi yeniden balatmak ister misiniz? + +; *** "Kuruluyor" sayfas +WizardInstalling=Kuruluyor +InstallingLabel=Ltfen [name] bilgisayarnza kurulurken bekleyin. + +; *** "Kurulum Tamamland" sayfas +FinishedHeadingLabel=[name] kurulum yardmcs tamamlanyor +FinishedLabelNoIcons=Bilgisayarnza [name] kurulumu tamamland. +FinishedLabel=Bilgisayarnza [name] kurulumu tamamland. Simgeleri yklemeyi setiyseniz, simgelere tklayarak uygulamay balatabilirsiniz. +ClickFinish=Kurulum yardmcsndan kmak iin Bitti zerine tklayn. +FinishedRestartLabel=[name] kurulumunun tamamlanmas iin, bilgisayarnz yeniden balatlmal. imdi yeniden balatmak ister misiniz? +FinishedRestartMessage=[name] kurulumunun tamamlanmas iin, bilgisayarnz yeniden balatlmal.%n%nimdi yeniden balatmak ister misiniz? +ShowReadmeCheck=Evet README dosyas grntlensin +YesRadio=&Evet, bilgisayar imdi yeniden balatlsn +NoRadio=&Hayr, bilgisayar daha sonra yeniden balatacam +; used for example as 'Run MyProg.exe' +RunEntryExec=%1 altrlsn +; used for example as 'View Readme.txt' +RunEntryShellExec=%1 grntlensin + +; *** "Kurulum iin Sradaki Disk Gerekli" iletileri +ChangeDiskTitle=Kurulum Yardmcs Sradaki Diske Gerek Duyuyor +SelectDiskLabel2=Ltfen %1 numaral diski takp Tamam zerine tklayn.%n%nDiskteki dosyalar aadakinden farkl bir klasrde bulunuyorsa, doru yolu yazn ya da Gzat zerine tklayarak doru klasr sein. +PathLabel=&Yol: +FileNotInDir2="%1" dosyas "%2" iinde bulunamad. Ltfen doru diski takn ya da baka bir klasr sein. +SelectDirectoryLabel=Ltfen sonraki diskin konumunu belirtin. + +; *** Kurulum aamas iletileri +SetupAborted=Kurulum tamamlanamad.%n%nLtfen sorunu dzelterek kurulum yardmcsn yeniden altrn. +AbortRetryIgnoreSelectAction=Yaplacak ilemi sein +AbortRetryIgnoreRetry=&Yeniden denensin +AbortRetryIgnoreIgnore=&Sorun yok saylp devam edilsin +AbortRetryIgnoreCancel=Kurulum iptal edilsin + +; *** Kurulum durumu iletileri +StatusClosingApplications=Uygulamalar kapatlyor... +StatusCreateDirs=Klasrler oluturuluyor... +StatusExtractFiles=Dosyalar ayklanyor... +StatusCreateIcons=Ksayollar oluturuluyor... +StatusCreateIniEntries=INI kaytlar oluturuluyor... +StatusCreateRegistryEntries=Kayt Defteri kaytlar oluturuluyor... +StatusRegisterFiles=Dosyalar kaydediliyor... +StatusSavingUninstall=Kaldrma bilgileri kaydediliyor... +StatusRunProgram=Kurulum tamamlanyor... +StatusRestartingApplications=Uygulamalar yeniden balatlyor... +StatusRollback=Deiiklikler geri alnyor... + +; *** eitli hata iletileri +ErrorInternal2= hata: %1 +ErrorFunctionFailedNoCode=%1 tamamlanamad. +ErrorFunctionFailed=%1 tamamlanamad; kod %2 +ErrorFunctionFailedWithMessage=%1 tamamlanamad; kod %2.%n%3 +ErrorExecutingProgram=u dosya yrtlemedi:%n%1 + +; *** Kayt defteri hatalar +ErrorRegOpenKey=Kayt defteri anahtar alrken bir sorun kt:%n%1%2 +ErrorRegCreateKey=Kayt defteri anahtar eklenirken bir sorun kt:%n%1%2 +ErrorRegWriteKey=Kayt defteri anahtar yazlrken bir sorun kt:%n%1%2 + +; *** INI hatalar +ErrorIniEntry="%1" dosyasna INI kayd eklenirken bir sorun kt. + +; *** Dosya kopyalama hatalar +FileAbortRetryIgnoreSkipNotRecommended=&Bu dosya atlansn (nerilmez) +FileAbortRetryIgnoreIgnoreNotRecommended=&Sorun yok saylp devam edilsin (nerilmez) +SourceIsCorrupted=Kaynak dosya bozulmu +SourceDoesntExist="%1" kaynak dosyas bulunamad +ExistingFileReadOnly2=Var olan dosya salt okunabilir olarak iaretlenmi olduundan zerine yazlamad. +ExistingFileReadOnlyRetry=&Salt okunur iareti kaldrlp yeniden denensin +ExistingFileReadOnlyKeepExisting=&Var olan dosya korunsun +ErrorReadingExistingDest=Var olan dosya okunmaya allrken bir sorun kt. +FileExistsSelectAction=Yaplacak ilemi sein +FileExists2=Dosya zaten var. +FileExistsOverwriteExisting=&Var olan dosyann zerine yazlsn +FileExistsKeepExisting=Var &olan dosya korunsun +FileExistsOverwriteOrKeepAll=&Sonraki akmalarda da bu ilem yaplsn +ExistingFileNewerSelectAction=Yaplacak ilemi sein +ExistingFileNewer2=Var olan dosya, kurulum yardmcs tarafndan yazlmaya allandan daha yeni. +ExistingFileNewerOverwriteExisting=&Var olan dosyann zerine yazlsn +ExistingFileNewerKeepExisting=Var &olan dosya korunsun (nerilir) +ExistingFileNewerOverwriteOrKeepAll=&Sonraki akmalarda bu ilem yaplsn +ErrorChangingAttr=Var olan dosyann znitelikleri deitirilirken bir sorun kt: +ErrorCreatingTemp=Hedef klasrde bir dosya oluturulurken bir sorun kt: +ErrorReadingSource=Kaynak dosya okunurken bir sorun kt: +ErrorCopying=Dosya kopyalanrken bir sorun kt: +ErrorReplacingExistingFile=Var olan dosya deitirilirken bir sorun kt: +ErrorRestartReplace=Yeniden balatmada zerine yazlamad: +ErrorRenamingTemp=Hedef klasrdeki bir dosyann ad deitirilirken sorun kt: +ErrorRegisterServer=DLL/OCX kayt edilemedi: %1 +ErrorRegSvr32Failed=RegSvr32 ilemi u kod ile tamamlanamad: %1 +ErrorRegisterTypeLib=Tr kitapl kayt defterine eklenemedi: %1 + +; *** Kaldrma srasnda grntlenecek ad iaretleri +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 bit +UninstallDisplayNameMark64Bit=64 bit +UninstallDisplayNameMarkAllUsers=Tm kullanclar +UninstallDisplayNameMarkCurrentUser=Geerli kullanc + +; *** Kurulum sonras hatalar +ErrorOpeningReadme=README dosyas alrken bir sorun kt. +ErrorRestartingComputer=Kurulum yardmcs bilgisayarnz yeniden balatamyor. Ltfen bilgisayarnz yeniden balatn. + +; *** Kaldrma yardmcs iletileri +UninstallNotFound="%1" dosyas bulunamad. Uygulama kaldrlamyor. +UninstallOpenError="%1" dosyas alamad. Uygulama kaldrlamyor. +UninstallUnsupportedVer="%1" uygulama kaldrma gnlk dosyasnn biimi, bu kaldrma yardmcs srm tarafndan anlalamad. Uygulama kaldrlamyor. +UninstallUnknownEntry=Kaldrma gnlnde bilinmeyen bir kayt (%1) bulundu. +ConfirmUninstall=%1 uygulamasn tm bileenleri ile birlikte tamamen kaldrmak istediinize emin misiniz? +UninstallOnlyOnWin64=Bu kurulum yalnz 64 bit Windows zerinden kaldrlabilir. +OnlyAdminCanUninstall=Bu kurulum yalnz ynetici haklarna sahip bir kullanc tarafndan kaldrlabilir. +UninstallStatusLabel=Ltfen %1 uygulamas bilgisayarnzdan kaldrlrken bekleyin. +UninstalledAll=%1 uygulamas bilgisayarnzdan kaldrld. +UninstalledMost=%1 uygulamas kaldrld.%n%nBaz bileenler kaldrlamad. Bunlar el ile silebilirsiniz. +UninstalledAndNeedsRestart=%1 kaldrma ileminin tamamlanmas iin bilgisayarnzn yeniden balatlmas gerekli.%n%nimdi yeniden balatmak ister misiniz? +UninstallDataCorrupted="%1" dosyas bozulmu. Kaldrlamyor. + +; *** Kaldrma aamas iletileri +ConfirmDeleteSharedFileTitle=Paylalan Dosya Silinsin mi? +ConfirmDeleteSharedFile2=Sisteme gre, paylalan u dosya baka bir uygulama tarafndan kullanlmyor ve kaldrlabilir. Bu paylalm dosyay silmek ister misiniz?%n%nBu dosya, baka herhangi bir uygulama tarafndan kullanlyor ise, silindiinde dier uygulama dzgn almayabilir. Emin deilseniz Hayr zerine tklayn. Dosyay sisteminizde brakmann bir zarar olmaz. +SharedFileNameLabel=Dosya ad: +SharedFileLocationLabel=Konum: +WizardUninstalling=Kaldrma Durumu +StatusUninstalling=%1 kaldrlyor... + +; *** Kapatmay engelleme nedenleri +ShutdownBlockReasonInstallingApp=%1 kuruluyor. +ShutdownBlockReasonUninstallingApp=%1 kaldrlyor. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 %2 srm +AdditionalIcons=Ek simgeler: +CreateDesktopIcon=Masast simg&esi oluturulsun +CreateQuickLaunchIcon=Hzl Balat simgesi &oluturulsun +ProgramOnTheWeb=%1 Web Sitesi +UninstallProgram=%1 Uygulamasn Kaldr +LaunchProgram=%1 Uygulamasn altr +AssocFileExtension=%1 &uygulamas ile %2 dosya uzants ilikilendirilsin +AssocingFileExtension=%1 uygulamas ile %2 dosya uzants ilikilendiriliyor... +AutoStartProgramGroupDescription=Balang: +AutoStartProgram=%1 otomatik olarak balatlsn +AddonHostProgramNotFound=%1 setiiniz klasrde bulunamad.%n%nYine de devam etmek istiyor musunuz? \ No newline at end of file diff --git a/installer/innosetup/Languages/Ukrainian.isl b/installer/innosetup/Languages/Ukrainian.isl new file mode 100644 index 000000000..c12c6ebf3 --- /dev/null +++ b/installer/innosetup/Languages/Ukrainian.isl @@ -0,0 +1,385 @@ +; *** Inno Setup version 6.1.0+ Ukrainian messages *** +; Author: Dmytro Onyshchuk +; E-Mail: mrlols3@gmail.com +; Please report all spelling/grammar errors, and observations. +; Version 2020.08.04 + +; *** Inno Setup 6.1.0 *** +; : +; E-Mail: mrlols3@gmail.com +; , . +; 2020.08.04 + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=<0423><043A><0440><0430><0457><043D><0441><044C><043A><0430> +LanguageID=$0422 +LanguageCodePage=1251 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 + +[Messages] + +; *** +SetupAppTitle= +SetupWindowTitle= %1 +UninstallAppTitle= +UninstallAppFullTitle= %1 + +; *** Misc. common +InformationTitle= +ConfirmTitle=ϳ +ErrorTitle= + +; *** SetupLdr messages +SetupLdrStartupMessage= %1 ', ? +LdrCannotCreateTemp= . +LdrCannotExecTemp= . +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%n %2: %3 +SetupFileMissing= %1 . , . +SetupFileCorrupt= . , . +SetupFileCorruptOrWrongVer= . , . +InvalidParameter= :%n%n%1 +SetupAlreadyRunning= . +WindowsVersionNotSupported= Windows, '. +WindowsServicePackRequired= %1 Service Pack %2 . +NotOnThisPlatform= %1. +OnlyOnThisPlatform= %1. +OnlyOnTheseArchitectures= ' Windows :%n%n%1 +WinVersionTooLowError= %1 %2 . +WinVersionTooHighError= %1 %2 . +AdminPrivilegesRequired= . +PowerUserPrivilegesRequired= . +SetupAppRunningError=, %1 .%n%n , ﳿ OK , . +UninstallAppRunningError=, %1 .%n%n , ﳿ OK , . + +; *** Startup questions +PrivilegesRequiredOverrideTitle= +PrivilegesRequiredOverrideInstruction= +PrivilegesRequiredOverrideText1=%1 ( ), . +PrivilegesRequiredOverrideText2=%1 , ( ). +PrivilegesRequiredOverrideAllUsers= & +PrivilegesRequiredOverrideAllUsersRecommended= & () +PrivilegesRequiredOverrideCurrentUser= +PrivilegesRequiredOverrideCurrentUserRecommended= & () + +; *** г +ErrorCreatingDir= "%1" +ErrorTooManyFilesInDir= "%1", + +; *** +ExitSetupTitle= +ExitSetupMessage= . , .%n%n .%n%n ? +AboutSetupMenuItem=& ... +AboutSetupTitle= +AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4 +AboutSetupNote= +TranslatorNote=Ukrainian translation by Dmytro Onyshchuk + +; *** +ButtonBack=< & +ButtonNext=& > +ButtonInstall=& +ButtonOK=OK +ButtonCancel= +ButtonYes=& +ButtonYesToAll= & +ButtonNo=&ͳ +ButtonNoToAll=& +ButtonFinish=& +ButtonBrowse=&... +ButtonWizardBrowse=&... +ButtonNewFolder=& + +; *** ij " " +SelectLanguageTitle= +SelectLanguageLabel= , . + +; *** +ClickNext= 볻, , . +BeveledLabel= +BrowseDialogTitle= +BrowseDialogLabel= ʻ. +NewFolderName= + +; *** "" +WelcomeLabel1= [name]. +WelcomeLabel2= [name/ver] .%n%n . + +; *** "" +WizardPassword= +PasswordLabel1= . +PasswordLabel3= , 볻, . . +PasswordEditLabel=&: +IncorrectPassword= . , . + +; *** "˳ " +WizardLicense=˳ +LicenseLabel= , . +LicenseLabel3= , . , . +LicenseAccepted= & +LicenseNotAccepted= & + +; *** "" +WizardInfoBefore= +InfoBeforeLabel= , , . +InfoBeforeClickLabel= , 볻. +WizardInfoAfter= +InfoAfterLabel= , , . +InfoAfterClickLabel= , 볻. + +; *** " " +WizardUserInfo= +UserInfoDesc= , . +UserInfoName=& : +UserInfoOrg=&: +UserInfoSerial=& : +UserInfoNameRequired= '. + +; *** " " +WizardSelectDir= +SelectDirDesc= [name]? +SelectDirLabel3= [name] . +SelectDirBrowseLabel= 볻, . , . +DiskSpaceGBLabel= [gb] . +DiskSpaceMBLabel= [mb] M . +CannotInstallToNetworkDrive= . +CannotInstallToUNCPath= . +InvalidPath= , :%n%nC:\APP%n%n UNC:%n%n\\\ +InvalidDrive= , . , . +DiskSpaceWarningTitle= +DiskSpaceWarning= %1 , %2 .%n%n ? +DirNameTooLong=' . +InvalidDirName= . +BadDirName32=' :%n%n%1 +DirExistsTitle= +DirExists=:%n%n%1%n%n . ? +DirDoesntExistTitle= +DirDoesntExist=:%n%n%1%n%n . ? + +; *** " " +WizardSelectComponents= +SelectComponentsDesc= ? +SelectComponentsLabel2= ; . 볻, . +FullInstallation= +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation= +CustomInstallation= +NoUninstallWarningTitle= +NoUninstallWarning=, :%n%n%1%n%n³ .%n%n ? +ComponentSize1=%1 K +ComponentSize2=%1 M +ComponentsDiskSpaceGBLabel= [gb] . +ComponentsDiskSpaceMBLabel= [mb] M . + +; *** " " +WizardSelectTasks= +SelectTasksDesc= ? +SelectTasksLabel2= [name] , 볻. + +; *** " " +WizardSelectProgramGroup= +SelectStartMenuFolderDesc= ? +SelectStartMenuFolderLabel3= . +SelectStartMenuFolderBrowseLabel= 볻, . , . +MustEnterGroupName= ' . +GroupNameTooLong= . +InvalidGroupName= . +BadGroupName=' :%n%n%1 +NoProgramGroupCheck2=& + +; *** " " +WizardReady= +ReadyLabel1= [name] . +ReadyLabel2a= , , . +ReadyLabel2b= . +ReadyMemoUserInfo= : +ReadyMemoDir= : +ReadyMemoType= : +ReadyMemoComponents= : +ReadyMemoGroup= : +ReadyMemoTasks= : + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel= ... +ButtonStopDownload=& +StopDownload= ? +ErrorDownloadAborted= +ErrorDownloadFailed= : %1 %2 +ErrorDownloadSizeFailed= : %1 %2 +ErrorFileHash1= : %1 +ErrorFileHash2= : %1, %2 +ErrorProgress= : %1 %2 +ErrorFileSize= : %1, %2 + +; *** "ϳ " +WizardPreparing=ϳ +PreparingDesc= [name] . +PreviousInstallNotCompleted= . .%n%nϳ , [name]. +CannotContinue= . , . +ApplicationsFound= , . . +ApplicationsFound2= , . . ϳ , . +CloseApplications=& +DontCloseApplications=& +ErrorCloseApplications= . , , , . +PrepareToInstallNeedsRestart= . ϳ , [name]%n%n ? + +; *** "" +WizardInstalling= +InstallingLabel= , , [name] '. + +; *** " " +FinishedHeadingLabel= [name] +FinishedLabelNoIcons= [name] . +FinishedLabel= [name] . . +ClickFinish= . +FinishedRestartLabel= [name] . ? +FinishedRestartMessage= [name] .%n%n ? +ShowReadmeCheck=, README +YesRadio=&, +NoRadio=&ͳ, +; used for example as 'Run MyProg.exe' +RunEntryExec=³ %1 +; used for example as 'View Readme.txt' +RunEntryShellExec= %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle= +SelectDiskLabel2= , %1 OK.%n%n , , . +PathLabel=&: +FileNotInDir2= "%1" "%2". , . +SelectDirectoryLabel= , . + +; *** Installation phase messages +SetupAborted= .%n%n , . +AbortRetryIgnoreSelectAction= +AbortRetryIgnoreRetry=& +AbortRetryIgnoreIgnore=& +AbortRetryIgnoreCancel=³ + +; *** +StatusClosingApplications= ... +StatusCreateDirs= ... +StatusExtractFiles= ... +StatusCreateIcons= ... +StatusCreateIniEntries= INI ... +StatusCreateRegistryEntries= ... +StatusRegisterFiles= ... +StatusSavingUninstall= ... +StatusRunProgram= ... +StatusRestartingApplications= ... +StatusRollback= ... + +; *** г +ErrorInternal2= : %1 +ErrorFunctionFailedNoCode=%1 +ErrorFunctionFailed=%1 ; %2 +ErrorFunctionFailedWithMessage=%1 ; %2.%n%3 +ErrorExecutingProgram= :%n%1 + +; *** +ErrorRegOpenKey= :%n%1\%2 +ErrorRegCreateKey= :%n%1\%2 +ErrorRegWriteKey= :%n%1\%2 + +; *** INI +ErrorIniEntry= INI- "%1". + +; *** +FileAbortRetryIgnoreSkipNotRecommended=& ( ) +FileAbortRetryIgnoreIgnoreNotRecommended=& ( ) +SourceIsCorrupted= +SourceDoesntExist= "%1" +ExistingFileReadOnly2= , . +ExistingFileReadOnlyRetry=& " " +ExistingFileReadOnlyKeepExisting=& +ErrorReadingExistingDest= : +FileExistsSelectAction= +FileExists2= . +FileExistsOverwriteExisting=& +FileExistsKeepExisting=& +FileExistsOverwriteOrKeepAll=& +ExistingFileNewerSelectAction= +ExistingFileNewer2= , . +ExistingFileNewerOverwriteExisting=& +ExistingFileNewerKeepExisting=& () +ExistingFileNewerOverwriteOrKeepAll=& +ErrorChangingAttr= : +ErrorCreatingTemp= : +ErrorReadingSource= : +ErrorCopying= : +ErrorReplacingExistingFile= : +ErrorRestartReplace= RestartReplace: +ErrorRenamingTemp= : +ErrorRegisterServer= DLL/OCX: %1 +ErrorRegSvr32Failed= RegSvr32, %1 +ErrorRegisterTypeLib= : %1 + +; *** Uninstall display name markings +UninstallDisplayNameMark=%1 (%2) +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32- +UninstallDisplayNameMark64Bit=64- +UninstallDisplayNameMarkAllUsers= +UninstallDisplayNameMarkCurrentUser= + +; *** Post-installation errors +ErrorOpeningReadme= README. +ErrorRestartingComputer= '. , . + +; *** +UninstallNotFound= "%1" , . +UninstallOpenError= "%1". +UninstallUnsupportedVer= "%1" . +UninstallUnknownEntry= (%1) +ConfirmUninstall= , %1 ? +UninstallOnlyOnWin64= 64- Windows. +OnlyAdminCanUninstall= . +UninstallStatusLabel= , , %1 '. +UninstalledAll=%1 '. +UninstalledMost= %1 .%n%n . . +UninstalledAndNeedsRestart= %1 .%n%n ? +UninstallDataCorrupted= "%1" . + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle= ? +ConfirmDeleteSharedFile2= , . ?%n%n , . , ͳ. . +SharedFileNameLabel=' : +SharedFileLocationLabel=: +WizardUninstalling= +StatusUninstalling= %1... + + +; *** +ShutdownBlockReasonInstallingApp= %1. +ShutdownBlockReasonUninstallingApp= %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1, %2 +AdditionalIcons= : +CreateDesktopIcon= & +CreateQuickLaunchIcon= & +ProgramOnTheWeb= %1 +UninstallProgram= %1 +LaunchProgram=³ %1 +AssocFileExtension=& %1 %2 +AssocingFileExtension= %1 %2... +AutoStartProgramGroupDescription=: +AutoStartProgram= %1 +AddonHostProgramNotFound=%1 %n%n ? diff --git a/installer/innosetup/Languages/Urdu.isl b/installer/innosetup/Languages/Urdu.isl new file mode 100644 index 000000000..4f4cc1d37 --- /dev/null +++ b/installer/innosetup/Languages/Urdu.isl @@ -0,0 +1,388 @@ +; *** Inno Setup version 6.1.0+ Urdu messages *** +; +;Translated by Hamza Hayat +;E-mail: hayat9437786878@gmail.com +;Last Modified: 02-10-2020 (21:18 AM) +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=Urdu +LanguageID=$0420 +LanguageCodePage=0 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName= +;WelcomeFontSize=12 +;TitleFontName= +;TitleFontSize=29 +;CopyrightFontName= +;CopyrightFontSize=8 + +[Messages] + +; *** Application titles +SetupAppTitle=سیٹ اپ +SetupWindowTitle=سیٹ اپ - %1 +UninstallAppTitle=ناتنصیب +UninstallAppFullTitle=%1 ناتنصیب + +; *** Misc. common +InformationTitle=معلومات +ConfirmTitle=تصدیق +ErrorTitle=نقص + +; *** SetupLdr messages +SetupLdrStartupMessage=یہ تنصیب کرے گا %1. کیا آپ جاری رکھنا چاہتے ہیں؟ +LdrCannotCreateTemp=ایک عارضی مسل نہیں بنا سکے. سیٹ اپ ساقط +LdrCannotExecTemp=عارضی ڈائریکٹری میں مسل کا نفاذ نہیں کر سکتا. سیٹ اپ ساقط +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1.%n%nنقص %2: %3 +SetupFileMissing=مسل %1 تنصیب ڈائریکٹری سے غائب ہے. مسئلہ کی تصحیح کریں یا پروگرام کی نئی نقل حاصل کریں. +SetupFileCorrupt=سیٹ اپ مسلیں خراب ہیں. برائے مہربانی پروگرام کی ایک نئی نقل حاصل کریں. +SetupFileCorruptOrWrongVer=سیٹ اپ مسلیں خراب ہیں، یا سیٹ اپ کے اس ورژن کے ساتھ مطابقت نہیں ہے. برائے مہربانی مسئلہ کی تصحیح کریں یا پروگرام کی نئی نقل حاصل کریں. +InvalidParameter=حکم لائن پر ایک ناجائز پیرامیٹر منظور کیا گیا:%n%n%1 +SetupAlreadyRunning=سیٹ اپ پہلے ہی چل رہا ہے. +WindowsVersionNotSupported=یہ پروگرام Windows کے اس ورژن کی معاونت نہیں کرتا جس پرآپ کا کمپیوٹر چل رہا ہے. +WindowsServicePackRequired=اس پروگرام کو %1 خدمت پیک %2 یا اس کے بعد کی درکار ہے. +NotOnThisPlatform=یہ پروگرام %1 پر نہیں چلایا جائے گا. +OnlyOnThisPlatform=اس پروگرام کی چلت %1 پر ہونی چاہیئے. +OnlyOnTheseArchitectures=یہ پروگرام صرف مندرجہ ذیل پروسیسر کے لئے ڈیزائن کیا گیا ونڈوز کے ورژن پر نصب کیا جا سکتا ہے:%n%n%1 +WinVersionTooLowError=اس پروگرام کو %1 ورژن %2 یا اس کے بعد کی ضرورت ہے. +WinVersionTooHighError=یہ پروگرام تنصیب نہیں کیا جا سکتا بر %1 ورژن %2 یا بعد. +AdminPrivilegesRequired=یہ پروگرام نصب کرتے وقت آپ کو بطور منتظم لاگ ان ہونا چاہیے. +PowerUserPrivilegesRequired=یہ پروگرام نصب کرتے وقت آپ کو بطور منتظم یا بجلی صارفین گروپ کے رکن کے طور پر لاگ ان ہونا چاہیے. +SetupAppRunningError=سیٹ اپ نے کھوج لگایا ہے کہ %1 اس وقت چل رہا ہے.%n%nبرائے مہربانی ابھی اس کی تمام مثالیں بند کریں، پھر کلک کریں ٹھيک ہے جاری رکھنے کے لئے، یا خروج کے لیے منسوخ کریں. +UninstallAppRunningError=ناتنصیب کاری نے کھوج لگایا ہے کہ %1 اس وقت چل رہا ہے.%n%nبرائے مہربانی ابھی اس کی تمام مثالیں بند کریں، پھر کلک کریں ٹھيک ہے جاری رکھنے کے لئے، یا خروج کے لیے منسوخ کریں. + +; *** Startup questions +PrivilegesRequiredOverrideTitle=سیٹ اپ تنصیب موڈ منتخب کریں +PrivilegesRequiredOverrideInstruction=تنصیب موڈ منتخب کریں +PrivilegesRequiredOverrideText1=%1 تمام صارفین کے لیے تنصیب کی جا سکتی ہے (انتظامی استحقاق کی ضرورت ہوتی ہے)، یا صرف آپ کے لئے. +PrivilegesRequiredOverrideText2=%1 صرف آپ کے لیے تنصیب کیا جا سکتا ہے، یا تمام صارفین کے لئے (انتظامی استحقاق کی ضرورت ہوتی ہے). +PrivilegesRequiredOverrideAllUsers=تمام صارفین &کے لیے تنصیب کریں +PrivilegesRequiredOverrideAllUsersRecommended=تمام صارفین &کے لیے تنصیب کریں (تجویز) +PrivilegesRequiredOverrideCurrentUser=فقط میرے &لیے تنصیب کریں +PrivilegesRequiredOverrideCurrentUserRecommended=فقط میرے &لیے تنصیب کریں (تجویز) + +; *** Misc. errors +ErrorCreatingDir=سیٹ اپ ڈائریکٹری "%1" بنانے میں نااہل ہے +ErrorTooManyFilesInDir=ڈائریکٹری "%1" میں مسل نہیں بنا سکے کیونکہ یہ بہت زیادہ مسلوں کا حامل ہے + +; *** Setup common messages +ExitSetupTitle=سیٹ اپ خروج کریں +ExitSetupMessage=سیٹ اپ مکمل نہیں ہوا ہے. اگر آپ اب خروج کریں گے تو, پروگرام تنصیب نہیں کیا جائے گا.%n%nتنصیب مکمل کرنے کے لیے آپ ایک اور بار سیٹ اپ چلا سکتے ہیں.%n%nسیٹ اپ خروج کریں؟ +AboutSetupMenuItem=&سیٹ اپ کے بارے میں... +AboutSetupTitle=سیٹ اپ کے بارے میں +AboutSetupMessage=%1 ورژن %2%n%3%n%n%1 ابتدائی صفحہ:%n%4 +AboutSetupNote= +TranslatorNote= + +; *** Buttons +ButtonBack=< &پچھلا +ButtonNext=&اگلا > +ButtonInstall=&تنصیب کریں +ButtonOK=ٹھيک ہے +ButtonCancel=منسوخ +ButtonYes=&ہاں +ButtonYesToAll=ہاں &تمام +ButtonNo=&نہيں +ButtonNoToAll=تم&ام کے لیے نہیں +ButtonFinish=&تکمیل +ButtonBrowse=&براؤز... +ButtonWizardBrowse=ب&راؤز... +ButtonNewFolder=&نیا پوشہ بنائیں + +; *** "Select Language" dialog messages +SelectLanguageTitle=سیٹ اپ زبان منتخب کریں +SelectLanguageLabel=تنصیب کے دوران استعمال کرنے کے لیے زبان منتخب کریں. + +; *** Common wizard text +ClickNext=جاری رکھنے کے لیے اگلا پر کلک کریں، یا سیٹ اپ سے باہر نکلنے کے لیے منسوخ کریں. +BeveledLabel= +BrowseDialogTitle=پوشہ کے لیے براؤز کریں +BrowseDialogLabel=نیچے فہرست میں ایک پوشہ منتخب کریں، پھر کلک کریں ٹھيک ہے. +NewFolderName=نیا پوشہ + +; *** "Welcome" wizard page +WelcomeLabel1=[name] سیٹ اپ مددگار میں خوش آمدید +WelcomeLabel2=یہ آپ کے کمپیوٹر پر [name/ver] نصب کرے گا.%n%nیہ سفارش کی جاتی ہے کہ آپ جاری رکھنے سے قبل دیگر تمام ایپلی کیشن بند کریں. + +; *** "Password" wizard page +WizardPassword=پاس ورڈ +PasswordLabel1=اس تنصیب ویں پاس ورڈ کی حفاظت ہے. +PasswordLabel3=براہ مہربانی پاس ورڈ فراہم کریں، پھر جاری رکھنے کے لیے اگلا پر کلک کریں. پاس ورڈ کیس-حساس ہے. +PasswordEditLabel=&پاس ورڈ: +IncorrectPassword=داخل کردہ پاس ورڈ صحیح نہیں ہے. دوبارہ کوشش کریں. + +; *** "License Agreement" wizard page +WizardLicense=لائسنس معاہدہ +LicenseLabel=جاری رکھنے سے قبل درج ذیل اہم معلومات پڑھیں. +LicenseLabel3=براہ کرم مندرجہ ذیل لائسنس کے معاہدے کو پڑھیں. تنصیب کے ساتھ جاری رکھنے سے قبل اس معاہدے کی شرائط قبول کریں. +LicenseAccepted=میں &معاہدہ قبول کرتا ہوں +LicenseNotAccepted=میں &معاہدہ قبول نہیں کتا ہوں + +; *** "Information" wizard pages +WizardInfoBefore=معلومات +InfoBeforeLabel=جاری رکھنے سے قبل درج ذیل اہم معلومات پڑھیں. +InfoBeforeClickLabel=جب آپ سیٹ اپ کے ساتھ جاری رکھنے کے لیے تیار ہوں تو، کلک کریں اگلا. +WizardInfoAfter=معلومات +InfoAfterLabel=جاری رکھنے سے قبل درج ذیل اہم معلومات پڑھیں. +InfoAfterClickLabel=جب آپ سیٹ اپ کے ساتھ جاری رکھنے کے لیے تیار ہوں تو، کلک کریں اگلا. + +; *** "User Information" wizard page +WizardUserInfo=معلومات صارف +UserInfoDesc=براہ مہربانی اپنی معلومات درج کریں. +UserInfoName=&صارف نام: +UserInfoOrg=&تنظیم: +UserInfoSerial=&سیریل نمبر: +UserInfoNameRequired=آپ کو ایک نام داخل کرنا چاہیئے. + +; *** "Select Destination Location" wizard page +WizardSelectDir=مقصود محل وقوع منتخب کریں +SelectDirDesc=جہاں [name] نصب کیا جانا ہے؟ +SelectDirLabel3=سیٹ اپ درج ذیل پوشہ میں [name] تنصیب کرے گا. +SelectDirBrowseLabel=جاری رکھنے کے لیے، کلک کریں اگلا. اگر آپ مختلف فولڈر کو منتخب کرنا چاہتے ہیں، تو براؤز پر کلک کریں. +DiskSpaceGBLabel=کم ازکم [gb] GB مفت ڈسک گنجایش مطلوب ہے. +DiskSpaceMBLabel=کم ازکم [mb] MB مفت ڈسک گنجایش مطلوب ہے. +CannotInstallToNetworkDrive=سیٹ اپ نیٹ ورک ڈرائیو پر تنصیب نہیں کر سکتا. +CannotInstallToUNCPath=سیٹ اپ UNC راہ پر تنصیب نہیں کر سکتا. +InvalidPath=ڈرائیو حرف کے ساتھ ایک مکمل راہ داخل کریں; مثال ک لیے:%n%nC:\APP%n%UNC راستہ نہیں ہے کے فارم میں:%n%n\\server\share +InvalidDrive=آپ کی منتخب ڈرائیو یا UNC حصہ داری موجود نہیں یا قابل رسائی نہیں ہے. کوئی اور منتخب کریں. +DiskSpaceWarningTitle=کافی ڈسک گنجایش نہیں +DiskSpaceWarning=سیٹ اپ تنصیب کرنے کے لیے کم ازکم %1 KB خالی جگہ کی ضرورت ہے، لیکن منتخب ڈرائیو فقط %2 KB دستیاب ہے.%n%nکیا آپ بہرصورت جاری رکھنا چاہتے ہیں؟ +DirNameTooLong=نام پوشہ یا راہ بہت طویل ہے. +InvalidDirName=نام پوشہ جائز نہیں. +BadDirName32=نام پوشہ درج ذیل کریکٹروں میں سے کوئی شامل نہیں ہو سکتا:%n%n%1 +DirExistsTitle=پوشہ موجود ہے +DirExists=وہ پوشہ:%n%n%1%n%nپہلے ہی موجود ہے. کیا آپ بہرصورت پوشہ کو تنصیب کرنا چاہتے ہیں؟ +DirDoesntExistTitle=پوشہ موجود نہیں +DirDoesntExist=وہ پوشہ:%n%n%1%n%nموجود نہیں ہے. کیا آپ پوشہ بنانا چاہتے ہیں؟ + +; *** "Select Components" wizard page +WizardSelectComponents=اجزاء منتخب کریں +SelectComponentsDesc=کون سا اجزاء نصب کیا جانا چاہئے؟ +SelectComponentsLabel2=وہ اجزاء منتخب کریں جو آپ تنصیب کرنا چاہتے ہیں; وہ اجزاء صاف کریں جو آپ تنصیب نہیں کرنا چاہتے. جب آپ جاری رکھنے کے لیے تیار ہوں تو اگلا پر کلک کریں. +FullInstallation=مکمل تنصیب +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=کومپیکٹ تنصیب +CustomInstallation=مخصوص تنصیب +NoUninstallWarningTitle=اجزاء موجود ہیں +NoUninstallWarning=سیٹ اپ نے کھوج لگایا ہے کہ درج ذیل اجزاء آپ کے کمپیوٹر پر پہلے ہی نصب ہیں:%n%n%1%n%nان اجزاء کو غیر منتخب کرنے سے ان کو ناتنصیب نہیں کرے گا.%n%nکیا آپ بہرصورت جاری رکھنا چاہیں گے؟ +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=حالیہ انتخاب کو کم ازکم [gb] GB ڈسک گنجایش کی درکار ہے. +ComponentsDiskSpaceMBLabel=حالیہ انتخاب کو کم ازکم [mb] MB ڈسک گنجایش کی درکار ہے. + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=اضافی مجموعہ کار منتخب کریں +SelectTasksDesc=کونسی اضافی کاموں کو انجام دیا جانا چاہئے؟ +SelectTasksLabel2=اس اضافی مجموعہ کار کو منتخب کریں جو آپ [name] نصب کرتے وقت انجام دینے کے لیے سیٹ اپ چاہتے ہیں، پھر کلک کریں اگلا. + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=شروع مینیو پوشہ منتخب کریں +SelectStartMenuFolderDesc=پروگرام کی تیز راہیں کہاں سیٹ کریں؟ +SelectStartMenuFolderLabel3=سیٹ اپ درج ذیل شروع مینیو پوشہ میں پروگرام کا تیز راہیں بنا دے گا. +SelectStartMenuFolderBrowseLabel=جاری رکھنے کے لیے، کلک کریں اگلا. اگر آپ مختلف پوشہ منتخب کرنا چاہتے ہیں، براؤز پر کلک کریں. +MustEnterGroupName=آپ کو پوشہ نام داخل کرنا چاہیئے. +GroupNameTooLong=نام پوشہ یا راہ بہت طویل ہے. +InvalidGroupName=نام پوشہ جائز نہیں. +BadGroupName=نام پوشہ میں درج ذیل کریکٹروں میں سے کوئی بھی شامل نہیں ہو سکتا:%n%n%1 +NoProgramGroupCheck2=&شروع مینیو پوشہ مت بنائیں + +; *** "Ready to Install" wizard page +WizardReady=تنصیب کے لیے تیار +ReadyLabel1=سیٹ اپ اب آپ کے کمپیوٹر پر [name] نصب کرنے کے لیے تیار ہے. +ReadyLabel2a=تنصیب کے ساتھ جاری رکھنے کے لیے تنصیب پر کلک کریں، یا اگر آپ کوئی سیٹنگیں جائزہ یا تبدیل کرنا چاہتے ہیں تو واپس پر کلک کریں. +ReadyLabel2b=تنصیب کے ساتھ جاری رکھنے کے لیے تنصیب پر کلک کریں. +ReadyMemoUserInfo=معلومات صارف: +ReadyMemoDir=مقصود محل وقوع: +ReadyMemoType=سیٹ اپ قسم: +ReadyMemoComponents=منتخب اجزاء: +ReadyMemoGroup=شروع مینیو پوشہ: +ReadyMemoTasks=اضافی کام: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=اضافی مسلیں ڈاؤن لوڈ کر رہا ہے... +ButtonStopDownload=&ڈاؤن لوڈ روکیں +StopDownload=آپ کو یقین ہے کہ آپ ڈاؤن لوڈ روکنا چاہتے ہیں؟ +ErrorDownloadAborted=ڈاؤن لوڈ ساقط +ErrorDownloadFailed=ڈاؤن لوڈ ناکام: %1 %2 +ErrorDownloadSizeFailed=سائز کے حصول میں ناکامی: %1 %2 +ErrorFileHash1=مسل ہیش ناکام: %1 +ErrorFileHash2=ناجائز مسل ہیش: expected %1, found %2 +ErrorProgress=ناجائز پیش رفت: %1 of %2 +ErrorFileSize=ناجائز مسل سائز: expected %1, found %2 + +; *** "Preparing to Install" wizard page +WizardPreparing=تنصیب کی تیاری کررہا ہے +PreparingDesc=سیٹ اپ آپ کے کمپیوٹر پر [name] نصب کرنے کی تیاری کر رہا ہے. +PreviousInstallNotCompleted=پچھلے پروگرام کی تنصیب/ہٹانا مکمل نہیں ہوئی. تنصیب مکمل کرنے کے لیے آپ کو کمپیوٹر پھر شروع کرنے کی ضرورت ہو گی.%n%nاپنے کمپیوٹر کو دوبارہ شروع کرنے کے بعد، [name] کی تنصیب مکمل کرنے کے لیے سیٹ اپ پھر چلائیں. +CannotContinue=سیٹ اپ جاری نہیں رہ سکتا. خروج کے لیے منسوخ پر کلک کریں. +ApplicationsFound=درج ذیل ایپلی کیشن ایسی مسلوں کا استعمال کر رہے ہیں جس کی سیٹ اپ کی طرف سے تازہ کاری کی ضرورت ہے. سفارش کی جاتی ہے کہ آپ ان ایپلی کیشنز کو خود بخود بند کرنے کے لیے سیٹ اپ کو اجازت دیں. +ApplicationsFound2=درج ذیل ایپلی کیشن ایسی مسلوں کا استعمال کر رہے ہیں جس کی سیٹ اپ کی طرف سے تازہ کاری کی ضرورت ہے. سفارش کی جاتی ہے کہ آپ ان ایپلی کیشنز کو خود بخود بند کرنے کے لیے سیٹ اپ کو اجازت دیں. تنصیب مکمل ہونے کے بعد، سیٹ اپ ایپلی کیشن پھر شروع کرنے کی کوشش کرے گا. +CloseApplications=&خود بخود ایپلی کیشنوں کو بند کریں +DontCloseApplications=&ایپلی کیشنوں کو بند نہ کریں +ErrorCloseApplications=سیٹ اپ خود بخود تمام ایپلی کیشنوں کو بند نہیں کر سکا. سفارش کی جاتی ہے کہ آپ مسلوں کا استعمال کر رہے تمام ایپلی کیشنز کو بند کریں جس کو جاری رکھنے سے قبل سیٹ اپ کی طرف سے تازہ کاری کی ضرورت ہے. +PrepareToInstallNeedsRestart=سیٹ اپ آپ کے کمپیوٹر کو پھر شروع کرنا چاہے گا. اپنے کمپیوٹر کو دوبارہ شروع کرنے کے بعد، [name] کی تنصیب مکمل کرنے کے لیے سیٹ اپ پھر چلائیں.%n%nکیا آپ ابھی پھر شروع کرنا چاہتے ہیں؟ + +; *** "Installing" wizard page +WizardInstalling=تنصیب کر رہا ہے +InstallingLabel=انتظار کریں جب تک سیٹ اپ آپ کے کمپیوٹر پر [name] تنصیب کتا ہے. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=[name] سیٹ اپ مددگار مکمل کیا جارہا ہے +FinishedLabelNoIcons=سیٹ اپ نے آپ کے کمپیوٹر پر [name] تنصیب کاری ختم کر دی ہے. +FinishedLabel=سیٹ اپ نے آپ کے کمپیوٹر پر [name] تنصیب کاری ختم کر دی ہے. ایپلی کیشن تنصیب شدہ تیزراہ منتخب کر کے شروع کی جا سکتی ہے. +ClickFinish=سیٹ اپ سے باہر نکلنے کے لیے تکمیل پر کلک کریں. +FinishedRestartLabel=[name] کی تنصیب مکمل کرنے کے لیے، سیٹ اپ آپ کے کمپیوٹر کو پھر شروع کرنا چاہے گا. کیا آپ ابھی پھر شروع کرنا چاہتے ہیں؟ +FinishedRestartMessage=[name] کی تنصیب مکمل کرنے کے لیے، سیٹ اپ آپ کے کمپیوٹر کو پھر شروع کرنا چاہے گا.%n%nکیا آپ ابھی پھر شروع کرنا چاہتے ہیں؟ +ShowReadmeCheck=جی ہاں، میں README فائل دیکھنا چاہتا ہوں +YesRadio=&ہاں، ابھی کمپیوٹر پھر شروع کریں +NoRadio=&نہیں، میں بعد میں کمپیوٹر پھر شروع کروں گا +; used for example as 'Run MyProg.exe' +RunEntryExec=چلایئں %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=دیکھیں %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=سیٹ اپ کو اگلے ڈسک کی ضرورت ہے +SelectDiskLabel2=ڈسک %1 داخل کریں اور ٹھیک ہے پر کلک کریں.%n%nاگر اس ڈسک پر مسلیں نیچے دکھائے گئے ایک کے علاوہ پوشہ میں موجود ہیں، صحیح راہ داخل کریں یا براؤز پر کلک کریں. +PathLabel=&راہ: +FileNotInDir2=مسل "%1" "%2" میں نہیں مل سکی. صحیح ڈسک داخل کریں یا کسی اور پوشہ کا انتخاب کریں. +SelectDirectoryLabel=اگلی ڈسک محل وقوع کی اختصاص کریں. + +; *** Installation phase messages +SetupAborted=سیٹ اپ مکمل نہیں ہوا.%n%nمسئلہ درست کریں اور سیٹ اپ پھر چلائیں. +AbortRetryIgnoreSelectAction=عمل منتخب کریں +AbortRetryIgnoreRetry=&دوبارہ کوشش کریں +AbortRetryIgnoreIgnore=&نقص نظرانداز کریں اور جاری رکھیں +AbortRetryIgnoreCancel=تنصیب منسوخ کریں + +; *** Installation status messages +StatusClosingApplications=اختتامی ایپلی کیشنوں... +StatusCreateDirs=ڈائریکٹریز بنانا... +StatusExtractFiles=مسلیں نکالنا... +StatusCreateIcons=شارٹ کٹ بنانا... +StatusCreateIniEntries=INI اندراجات بناناs... +StatusCreateRegistryEntries=رجسٹری اندراجات بنانا... +StatusRegisterFiles=مسل رجسٹر کر رہا ہے... +StatusSavingUninstall=ناتنصیب معلومات محفوظ کر رہا ہےناتنصیب معلومات محفوظ کر رہا ہے... +StatusRunProgram=تنصیب مکمل... +StatusRestartingApplications=ایپلی کیشن پھر شروع... +StatusRollback=تبدیلیوں کو رولنگ بیک... + +; *** Misc. errors +ErrorInternal2=اندرونی نقص: %1 +ErrorFunctionFailedNoCode=%1 ناکام +ErrorFunctionFailed=%1 ناکام; کوڈ %2 +ErrorFunctionFailedWithMessage=%1 ناکام; کوڈ %2.%n%3 +ErrorExecutingProgram=مسل کے نفاذ میں ناکام:%n%1 + +; *** Registry errors +ErrorRegOpenKey=رجسٹری کلید کھولنے میں نقص:%n%1\%2 +ErrorRegCreateKey=رجسٹری کلید بنانے میں نقص:%n%1\%2 +ErrorRegWriteKey=رجسٹری کلید میں تحریر میں نقص:%n%1\%2 + +; *** INI errors +ErrorIniEntry=مسل "%1" INI اندراج بنانے میں نقص. + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=&یہ مسل چھوڑیں (سفارش کی نہیں) +FileAbortRetryIgnoreIgnoreNotRecommended=&نقص نظرانداز کریں اور جاری رکھیں (سفارش کی نہیں) +SourceIsCorrupted=ماخذ مسل خراب ہے +SourceDoesntExist=ماخذ مسل "%1" موجود نہیں +ExistingFileReadOnly2=موجود مسل تبدیل نہیں کی جا سکی کیونکہ اسے read-only نشان زد کیا گیا ہے. +ExistingFileReadOnlyRetry=&read-only خاصیت ہٹائیں اور پھر کوشش کریں +ExistingFileReadOnlyKeepExisting=&موجودہ مسل رکھیں +ErrorReadingExistingDest=موجود مسل کو پڑھنے کی کوشش کے دوران ایک نقص واقع ہوا: +FileExistsSelectAction=عمل منتخب کریں +FileExists2=مسل پہلے ہی موجود ہے. +FileExistsOverwriteExisting=&موجود مسل پر برتحریر کریں +FileExistsKeepExisting=&موجودہ مسل رکھیں +FileExistsOverwriteOrKeepAll=&اگلے تنازعات کے لئے یہ کریں +ExistingFileNewerSelectAction=عمل منتخب کریں +ExistingFileNewer2=موجودہ مسل ایک سیٹ اپ کے لیے نیا ہے جو تنصیب کی کوشش کر رہا ہے. +ExistingFileNewerOverwriteExisting=&موجود مسل پر برتحریر کریں +ExistingFileNewerKeepExisting=&موجودہ مسل رکھیں (تجویز) +ExistingFileNewerOverwriteOrKeepAll=&اگلے تنازعات کے لئے یہ کریں +ErrorChangingAttr=موجود مسل کے اوصاف تبدیل کرنے کی کوشش کے دوران نقص واقع ہوا: +ErrorCreatingTemp=مقصود ڈائریکٹری میں مسل بنانے کی کوشش کے دوران نقص واقع ہوا: +ErrorReadingSource=ماخذ مسل پڑھنے کی کوشش کے دوران نقص واقع ہوا: +ErrorCopying=مسل نقل کرنے کی کوشش کے دوران نقص واقع ہوا: +ErrorReplacingExistingFile=موجود مسل کی جگہ بنانے کی کوشش میں ایک نقص واقع ہوا: +ErrorRestartReplace=RestartReplace ناکام: +ErrorRenamingTemp=مقصود ڈائریکٹری میں مسل کا نام تبدیل کرنے کی کوشش کے دوران نقص واقع ہوا: +ErrorRegisterServer=DLL/OCX رجسٹر نہیں کر سکا: %1 +ErrorRegSvr32Failed=RegSvr32 خروج ضابطہ کے ساتھ ناکام %1 +ErrorRegisterTypeLib=قسم لائبریری رجسٹر نہیں کر سکا: %1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32-bit +UninstallDisplayNameMark64Bit=64-bit +UninstallDisplayNameMarkAllUsers=تمام صارفین +UninstallDisplayNameMarkCurrentUser=موجودہ صارف + +; *** Post-installation errors +ErrorOpeningReadme=README مسل کھولنے کی کوشش کے دوران نقص واقع ہوا. +ErrorRestartingComputer=سیٹ اپ کمپیوٹر پھر شروع نہیں کر سکا. براہ کرم اسے دستی طور پر کریں. + +; *** Uninstaller messages +UninstallNotFound=مسل "%1" موجود نہیں. ناتنصیب نہیں کر سکتے. +UninstallOpenError=مسل "%1" نہیں کھولی جا سکی. ناتنصیب نہیں کر سکتے +UninstallUnsupportedVer=ناتنصیب لاگ مسل "%1" ناتنصیبکار کے اس ورژن کی طرف سے تسلیم شدہ وضع میں ہے. ناتنصیب نہیں کر سکتے +UninstallUnknownEntry=ایک نامعلوم اندراج (%1) ناتنصیب لاگ میں سامنا کیا گیا +ConfirmUninstall=آپ کو یقین کے آپ %1 اور اس کے تمام اجزاء کو مکمل طور پر ہٹانا چاہتے ہیں؟ +UninstallOnlyOnWin64=یہ تنصیب صرف 64-bit Windows پر ناتنصیب کی جا سکتی ہے. +OnlyAdminCanUninstall=یہ تنصیب صرف ایک صارف کی طرف سے انتظامی استحقاق کے ساتھ نا تنصیب کی جا سکتی ہے. +UninstallStatusLabel=انتظار کریں جبکہ %1 آپ کے کمپیوٹر سے ہٹا دیا جاۓ. +UninstalledAll=%1 آپ کے کمپیوٹر سے کامیابی سے ہٹا دیا گیا. +UninstalledMost=%1 ناتنصیب مکمل.%n%nکچھ عناصر نہیں ہٹایا جا سکا. یہ دستی طور پر ہٹا دیا جا سکتا ہے. +UninstalledAndNeedsRestart=%1 کی ناتنصیب مکمل کرنے کے لیے، آپ کا کمپیوٹر پھر شروع ہونا چاہیے.%n%nکیا آپ ابھی پھر شروع کرنا چاہتے ہیں؟ +UninstallDataCorrupted="%1" مسل خراب ہے. ناتنصیب نہیں کر سکتے + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=حصہ دارانہ مسل ہٹائیں? +ConfirmDeleteSharedFile2=نظام نشاندہی کرتا ہے کہ درج ذیل مشترکہ مسل کسی بھی پروگرام کے استعمال میں نہیں ہے. کیا آپ اس حصہ دارانہ مسل کو ہٹانے کے لیے ناتنصیب کرنا چاہیں گے?%n%nاگر کوئی پروگرام اب بھی اس مسل کا استعمال کر رہے ہیں اور اسے ہٹا دیا جاتا ہے، وہ پروگرام ٹھیک سے کام نہیں کر سکتے. اگر آپ کو یقین نہیں ہے، منتخب کریں نہیں. آپ کے سسٹم پر مسل چھوڑنا کسی بھی نقصان کا سبب نہیں ہوگا. +SharedFileNameLabel=مسل کا نام: +SharedFileLocationLabel=محل وقوع: +WizardUninstalling=غیر تنصیب حالت +StatusUninstalling=ناتنصیب %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=تنصیب %1. +ShutdownBlockReasonUninstallingApp=ناتنصیب %1. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 ورژن %2 +AdditionalIcons=اضافی شارٹ کٹس: +CreateDesktopIcon=ایک ڈیسک ٹاپ &تیز راہ بنائیں +CreateQuickLaunchIcon=ایک سریع &شروع تیز راہ بنائیں +ProgramOnTheWeb=%1 ویب پر +UninstallProgram=ناتنصیب %1 +LaunchProgram=شروع %1 +AssocFileExtension=&واپستہ %1 مع %2 مسل توسیع کریں +AssocingFileExtension=واپستہ %1 مع %2 مسل توسیع... +AutoStartProgramGroupDescription=آغاز: +AutoStartProgram=خودبخود شروع کریں %1 +AddonHostProgramNotFound=%1 آپ کی منتخب پوشہ میں نہیں واقع ہو سکا.%n%nکیا آپ بہرصورت جاری رکھنا چاہتے ہیں؟ diff --git a/installer/innosetup/Languages/Uyghur.islu b/installer/innosetup/Languages/Uyghur.islu index 1f702c7a5..e9f288dc1 100644 --- a/installer/innosetup/Languages/Uyghur.islu +++ b/installer/innosetup/Languages/Uyghur.islu @@ -1,9 +1,9 @@ -; *** Inno Setup version 5.5.3+ Uyghur messages *** -; Translated by Irshat ghalib [ uqkun09@msn.cn ] +; *** Inno Setup version 6.1.0+ Uyghur messages *** +; Translated by Irshat Ghalip (uqkun09@msn.cn) ; To download user-contributed translations of this file, go to: -; http://www.jrsoftware.org/files/istrans/ +; https://jrsoftware.org/files/istrans/ ; -; Note:When translating this text, do not add periods (.) to the end of +; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). @@ -11,328 +11,375 @@ [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. - LanguageName=ئۇيغۇرچە LanguageID=$0480 LanguageCodePage=0 - -;If the language you are translating to requires special font faces or +RightToLeft=yes +; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. -DialogFontName=ALKATIP -;DialogFontSize=12 -WelcomeFontName=ALKATIP -;WelcomeFontSize=18 -TitleFontName=ALKATIP -;TitleFontSize=35 -CopyrightFontName=ALKATIP -;CopyrightFontSize=11 +;DialogFontName= +;DialogFontSize=8 +;WelcomeFontName=Verdana +;WelcomeFontSize=12 +;TitleFontName=Arial +;TitleFontSize=29 +;CopyrightFontName=Arial +;CopyrightFontSize=8 [Messages] -; ‫*** ‫Application ‫titles -SetupAppTitle=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى -SetupWindowTitle=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫- ‫%1 -UninstallAppTitle=‫‮‫‫‮‫ئۆچۈرۈش ‫يېتەكچىسى -UninstallAppFullTitle=‫‮‫‫‮‫%1 ‫ئۆچۈرۈش ‫يېتەكچىسى +; *** Application titles +SetupAppTitle=قاچىلاش +SetupWindowTitle=%1 - قاچىلاش +UninstallAppTitle=چىقىرىۋېتىش +UninstallAppFullTitle=%1 نى چىقىرىۋېتىش -; ‫*** ‫Misc. ‫common -InformationTitle=‫‮‫‫‮‫ئۇچۇر -ConfirmTitle=‫‮‫‫‮‫جەزىملەش -ErrorTitle=‫‮‫‫‮‫خاتالىق +; *** Misc. common +InformationTitle=ئۇچۇر +ConfirmTitle=جەزملەشتۈرۈش +ErrorTitle=خاتالىق -; ‫*** ‫SetupLdr ‫messages -SetupLdrStartupMessage=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫سىزنىڭ ‫كومپيۇتېرىڭىزغا ‫%1نى ‫قاچىلايدۇ. ‫راستتىنلا ‫داۋاملاشتۇرامسىز؟ -LdrCannotCreateTemp=‫‮‫‫‮‫ۋاقىتلىق ‫ھۆججەت ‫قۇرالمىدى. ‫قاچىلاش ‫توختىتىلدى -LdrCannotExecTemp=‫‮‫‫‮‫ۋاقىتلىق ‫ھۆججەت ‫قىسقۇچتىكى ‫ھۆججەت ‫ئىجرا ‫بولمىدى. ‫قاچىلاش ‫توختىتىلدى +; *** SetupLdr messages +SetupLdrStartupMessage=ھازىر %1 قاچىلىنىدۇ. داۋاملاشتۇرامسىز؟ +LdrCannotCreateTemp=ۋاقىتلىق ھۆججەت قۇرالمىدى. قاچىلاش توختىتىلدى +LdrCannotExecTemp=ۋاقىتلىق مۇندەرىجىدىكى ھۆججەت ئىجرا بولمىدى. قاچىلاش توختىتىلدى +HelpTextNote= -; ‫*** ‫Startup ‫error ‫messages ‫خاتالىق ‫كۆزنىكى -LastErrorMessage=‫‮‫‫‮‫%1.%n%n ‫خاتالىق ‫%2:%3 -SetupFileMissing=‫‮‫‫‮‫قاچىلاش ‫مۇندەرىجىسىدە ‫%1 ‫ھۆججىتى ‫يوق. ‫بۇ ‫مەسىلىنى ‫ھەل ‫قىلىڭ ‫ياكى ‫قايتىدىن ‫بىر ‫نۇسخا ‫كۆچۈرۈلمە ‫دېتالغا ‫ئېرىشىڭ. -SetupFileCorrupt=‫‮‫‫‮‫قاچىلاش ‫ھۆججىتى ‫بۇزۇلغان. ‫قايتىدىن ‫بىر ‫نۇسخا ‫كۆچۈرۈلمە ‫دېتالغا ‫ئېرىشىڭ. -SetupFileCorruptOrWrongVer=‫‮‫‫‮‫قاچىلاش ‫ھۆججىتى ‫بۇزۇلغان، ‫ياكى ‫بۇ ‫قاچىلاش ‫ھۆججىتى ‫مۇقىم ‫ئەمەس. ‫بۇ ‫مەسىلىنى ‫ھەل ‫قىلىڭ، ‫ياكى ‫قاچىلاش ‫ھۆججىتىنى ‫قايتىدىن ‫چۈشۈرۈڭ. -InvalidParameter=‫‮‫‫‮‫ئۈنۈمسىز ‫بۇيرۇق ‫پارامېتىرى:%n%n%1 -SetupAlreadyRunning=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫ئىجرا ‫بولۇۋاتىدۇ. -WindowsVersionNotSupported=‫‮‫‫‮‫دېتال ‫بۇ ‫كومپيۇتېرنىڭ ‫نەشرىنى ‫قوللىمايدۇ. -WindowsServicePackRequired=‫‮‫‫‮‫دېتال ‫%1 ‫Service ‫Pack ‫%2 ‫ياكى ‫ئۇنىڭدىن ‫يۇقىرى ‫نەشرىنى ‫تەلەپ ‫قىلىدۇ. -NotOnThisPlatform=‫‮‫‫‮‫دېتال ‫%1 ‫دە ‫ئىجرا ‫بولمايدۇ. -OnlyOnThisPlatform=‫‮‫‫‮‫دېتال ‫چوقۇم ‫%1دە ‫ئىجرا ‫بولىدۇ. -OnlyOnTheseArchitectures=‫‮‫‫‮‫دېتال ‫پەقەت ‫تۆۋەندىكى ‫CPU ‫بولغان ‫Windows ‫نەشرىگە ‫قاچىلىغىلى ‫بولىدۇ:%n%n%1 -MissingWOW64APIs=‫‮‫‫‮‫كومپيۇتېرىڭىزدا ‫Windows ‫نىڭ ‫64 ‫لىك ‫دېتاللىرى ‫ئىجرا ‫بولمايدۇ.Service ‫Pack ‫%1 ‫ئارقىلىق ‫مەسىلىڭىزنى ‫ھەل ‫قىلىڭ. -WinVersionTooLowError=‫‮‫‫‮‫دېتال ‫%2 ‫نەشرىدىن ‫يۇقىرى ‫بولغان ‫%1 ‫نى ‫تەلەپ ‫قىلىدۇ. -WinVersionTooHighError=‫‮‫‫‮‫دېتال ‫%2 ‫نەشرى ‫ياكى ‫%1 ‫دىن ‫يۇقىرى ‫نەشىرىدە ‫ئىجرا ‫بولىدۇ. -AdminPrivilegesRequired=‫‮‫‫‮‫باشقۇرغۇچىلىق ‫سالاھىيتىدە ‫كىرگەندىن ‫كېيىن ‫ئاندىن ‫بۇ ‫دېتالنى ‫قاچىلالايسىز. -PowerUserPrivilegesRequired=‫‮‫‫‮‫باشقۇرغۇچىلىق ‫سالاھىيتىدە ‫ياكى ‫ئۇنىڭدىن ‫يۇقىرى ‫سالاھىيەتتە ‫كىرگەندىن ‫كېيىن ‫ئاندىن ‫بۇ ‫دېتالنى ‫قاچىلالايسىز. -SetupAppRunningError=‫‮‫‫‮‫دېتال ‫%1 ‫تېخى ‫ئىجرا ‫بولۇۋېتىپتۇ.%n%n ‫بارلىق ‫ئېچىلغان ‫كۆزنەكلەرنى ‫تاقىۋېتىڭ، ‫ئاندىن ‫"مۇقىملاش" ‫نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ، ‫ياكى ‫"قالدۇرۇش" ‫نى ‫چېكىپ ‫چېكىنىڭ. -UninstallAppRunningError=‫‮‫‫‮‫دېتال ‫%1 ‫تېخى ‫ئىجرا ‫بولۇۋېتىپتۇ.%n%n ‫بارلىق ‫ئېچىلغان ‫كۆزنەكلەرنى ‫تاقىۋېتىڭ، ‫ئاندىن ‫"مۇقىملاش" ‫نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ، ‫ياكى ‫"قالدۇرۇش" ‫نى ‫چېكىپ ‫چېكىنىڭ. +; *** Startup error messages +LastErrorMessage=%1.%n%nخاتالىق %2: %3 +SetupFileMissing=قاچىلاش مۇندەرىجىسىدە %1 ھۆججىتى يوق. مەسىلىنى تۈزۈتۈڭ ياكى پىروگراممىنىڭ يېڭى نۇسخىسىغا ئېرىشىڭ. +SetupFileCorrupt=قاچىلاش ھۆججەتلىرى بۇزۇلغان. پىروگراممىنىڭ يېڭى نۇسخىسىغا ئېرىشىڭ. +SetupFileCorruptOrWrongVer=قاچىلاش ھۆججەتلىرى بۇزۇلغان ياكى بۇ نەشرى بىلەن ماسلاشمايدۇ. مەسىلىنى تۈزۈتۈڭ ياكى پىروگراممىنىڭ يېڭى نۇسخىسىغا ئېرىشىڭ. +InvalidParameter=بۇيرۇق قۇرىدا ئىناۋەتسىز پارامېتىر بار:%n%n%1 +SetupAlreadyRunning=قاچىلاش پىروگراممىسى ئىجرا بولۇۋاتىدۇ. +WindowsVersionNotSupported=بۇ پىروگرامما كومپيۇتېرىڭىزدا ئىجرا بولۇۋاتقان Windows نەشرىنى قوللىمايدۇ. +WindowsServicePackRequired=بۇ پىروگرامما %1 مۇلازىمەت بولىقى %2 ياكى يېڭىسىنى تەلەپ قىلىدۇ. +NotOnThisPlatform=بۇ پىروگرامما %1 دا ئىجرا بولمايدۇ. +OnlyOnThisPlatform=بۇ پىروگرامما چوقۇم %1 دا ئىجرا قىلىنىشى كېرەك. +OnlyOnTheseArchitectures=بۇ پىروگراممىنى پەقەت تۆۋەندىكى بىر تەرەپ قىلغۇچ قۇرۇلمىسى ئۈچۈن لايىھەلەنگەن Windows نەشرىگە قاچىلاشقا بولىدۇ:%n%n%1 +WinVersionTooLowError=بۇ پىروگرامما %1 نەشرى %2 ياكى يېڭىسىنى تەلەپ قىلىدۇ. +WinVersionTooHighError=بۇ پىروگرامما %1 نەشرى %2 ياكى يېڭىسىغا قاچىلانمايدۇ. +AdminPrivilegesRequired=بۇ پىروگراممىنى قاچىلىغاندا چوقۇم باشقۇرغۇچى سالاھىيىتىدە كىرىشىڭىز كېرەك. +PowerUserPrivilegesRequired=بۇ پىروگراممىنى قاچىلىغاندا چوقۇم باشقۇرغۇچى ياكى ھوقۇقلۇق ئىشلەتكۈچىلەر گۇرۇپپىسىنىڭ ئەزاسى سالاھىيىتىدە كىرىشىڭىز كېرەك. +SetupAppRunningError=قاچىلاش پىروگراممىسى %1 نىڭ ئىجرا بولۇۋاتقانلىقىنى بايقىدى.%n%nئۇنىڭ ھەممە جەريانلىرىنى تاقاڭ ھەمدە «ماقۇل» نى چېكىپ داۋاملاشتۇرۇڭ. ياكى «ئىناۋەتسىز» نى چېكىپ چېكىنىڭ. +UninstallAppRunningError=چىقىرىۋېتىش پىروگراممىسى %1 نىڭ ئىجرا بولۇۋاتقانلىقىنى بايقىدى.%n%nئۇنىڭ ھەممە جەريانلىرىنى تاقاڭ ھەمدە «ماقۇل» نى چېكىپ داۋاملاشتۇرۇڭ. ياكى «ئىناۋەتسىز» نى چېكىپ چېكىنىڭ. -; ‫*** ‫Misc. ‫errors -ErrorCreatingDir=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى"%1" -ErrorTooManyFilesInDir=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ"%1"نىڭ ‫ئىچىدە ‫ھۆججەت ‫بەك ‫كۆپكەن، ‫ئىچىگە ‫ھۆججەت ‫قۇرغىلى ‫بولمىدى +; *** Startup questions +PrivilegesRequiredOverrideTitle=قاچىلاش پىروگراممىسىنىڭ قاچىلاش ھالىتىنى تاللاش +PrivilegesRequiredOverrideInstruction=قاچىلاش ھالىتىنى تاللاش +PrivilegesRequiredOverrideText1=%1 نى بارلىق ئىشلەتكۈچىلەر (باشقۇرغۇچىلىق ھوقۇقى تەلەپ قىلىدۇ) ئۈچۈن ياكى سىز ئۈچۈنلا قاچىلاشقا بولىدۇ. +PrivilegesRequiredOverrideText2=%1 نى سىز ئۈچۈنلا ياكى بارلىق ئىشلەتكۈچىلەر (باشقۇرغۇچىلىق ھوقۇقى تەلەپ قىلىدۇ) ئۈچۈن قاچىلاشقا بولىدۇ. +PrivilegesRequiredOverrideAllUsers=بارلىق ئىشلەتكۈچىلەرگە قاچىلاش(&A) +PrivilegesRequiredOverrideAllUsersRecommended=بارلىق ئىشلەتكۈچىلەرگە قاچىلاش(&A) (تەۋسىيە) +PrivilegesRequiredOverrideCurrentUser=پەقەت مەن ئۈچۈنلا قاچىلاش(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=پەقەت مەن ئۈچۈنلا قاچىلاش(&M) (تەۋسىيە) -; ‫*** ‫Setup ‫common ‫messages -ExitSetupTitle=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسىدىن ‫چېكىنىش -ExitSetupMessage=‫‮‫‫‮‫قاچىلاش ‫تاماملانمىدى. ‫ئەگەر ‫ھازىر ‫چېكىنسىڭىز، ‫دېتال ‫قاچىلانمايدۇ.%n%nسىز ‫كېلەر ‫قېتىمدا ‫قاچىلاش ‫يېتەكچىسىنى ‫قايتا ‫قوزغىتىپ ‫قاچىلاشنى ‫تاماملىسىڭىز ‫بولىدۇ.%n%nقاچىلاش ‫يېتەكچىسىدىن ‫راستتىنلا ‫چېكىنەمسىز؟ -AboutSetupMenuItem=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫ھەققىدە(&A)… -AboutSetupTitle=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫ھەققىدە -AboutSetupMessage=‫‮‫‫‮‫%1 ‫نەشرى ‫%2%n%3%n%n%1 ‫تور ‫بېكىتى:%n%4 -AboutSetupNote=‫‮‫‫‮‫ -TranslatorNote=‫‮‫‫‮‫ +; *** Misc. errors +ErrorCreatingDir=قاچىلاش پىروگراممىسى «%1» مۇندەرىجىسىنى قۇرالمىدى +ErrorTooManyFilesInDir=«%1» مۇندەرىجىسىگە ھۆججەت قۇرالمىدى، چۈنكى ئۇنىڭدا بەك كۆپ ھۆججەت بار -; ‫*** ‫Buttons ‫كۇنۇپكىلار -ButtonBack=<ئالدىنقى قەدەم(&B) -ButtonNext=كېيىنكى قەدەم(&N)> +; *** Setup common messages +ExitSetupTitle=قاچىلاشتىن چېكىنىش +ExitSetupMessage=قاچىلاش تاماملانمىدى. ئەگەر ھازىر چېكىنسىڭىز، پىروگرامما قاچىلانمايدۇ.%n%nقاچىلاشنى تاماملاش ئۈچۈن، كېلەر قېتىم قاچىلاش پىروگراممىسىنى قايتا ئىجرا قىلسىڭىز بولىدۇ.%n%nقاچىلاشتىن چېكىنەمسىز؟ +AboutSetupMenuItem=قاچىلاش پىروگراممىسى ھەققىدە(&A)... +AboutSetupTitle=قاچىلاش پىروگراممىسى ھەققىدە +AboutSetupMessage=%1 نەشرى %2%n%3%n%n%1 باش بەت:%n%4 +AboutSetupNote= +TranslatorNote=Uyghur translation by Irshat Ghalip (uqkun09@msn.cn) + +; *** Buttons +ButtonBack=< قايتىش(&B) +ButtonNext=كېيىنكى(&N) > ButtonInstall=قاچىلاش(&I) -ButtonOK=جەزىملەش +ButtonOK=ماقۇل ButtonCancel=ئىناۋەتسىز ButtonYes=ھەئە(&Y) -ButtonYesToAll=ھەممىنى تاللاش(&A) +ButtonYesToAll=ھەممىگە ھەئە(&A) ButtonNo=ياق(&N) -ButtonNoToAll=ھەممىنى قالدۇرۇش(&O) +ButtonNoToAll=ھەممىگە ياق(&O) ButtonFinish=تامام(&F) -ButtonBrowse=…كۆرۈش(&B) -ButtonWizardBrowse=…كۆرۈش(&R) -ButtonNewFolder=ھۆججەت قىسقۇچ قۇرۇش(&M) +ButtonBrowse=كۆرۈش(&B)... +ButtonWizardBrowse=كۆرۈش(&R)... +ButtonNewFolder=يېڭى قىسقۇچ قۇرۇش(&M) -; ‫*** ‫"Select ‫Language" ‫dialog ‫messages -SelectLanguageTitle=‫‮‫‫‮‫تىل ‫تاللاڭ -SelectLanguageLabel=‫‮‫‫‮‫قاچىلاش ‫جەريانىدا ‫ئىشلىتىدىغان ‫تىلنى ‫تاللاڭ: +; *** "Select Language" dialog messages +SelectLanguageTitle=قاچىلاش تىلىنى تاللاش +SelectLanguageLabel=قاچىلاش جەريانىدا ئىشلىتىدىغان تىلنى تاللاڭ. -; ‫*** ‫Common ‫wizard ‫text -ClickNext=‫‮‫‫‮‫"كېيىنكى ‫قەدەم"نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ ‫ياكى ‫"ئىناۋەتسىز"نى ‫چېكىپ ‫قاچىلاش ‫يېتەكچىسىدىن ‫چېكىنىڭ. -BeveledLabel=‫‮‫‫‮‫ -BrowseDialogTitle=‫‮‫‫‮‫تاللانغان ‫ھۆججەت ‫قىسقۇچنى ‫كۆرۈش -BrowseDialogLabel=‫‮‫‫‮‫تۆۋەندىكى ‫تىزىملىكتىن ‫ھۆججەت ‫قىسقۇچتىن ‫بىرنى ‫تاللاڭ ‫ھەمدە ‫"جەزىملەش"نى ‫چېكىڭ. -NewFolderName=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫قۇرۇش +; *** Common wizard text +ClickNext=«كېيىنكى» نى چېكىپ داۋاملاشتۇرۇڭ ياكى «ئىناۋەتسىز» نى چېكىپ قاچىلاشتىن چېكىنىڭ. +BeveledLabel= +BrowseDialogTitle=قىسقۇچ كۆرۈش +BrowseDialogLabel=تۆۋەندىكى تىزىملىكتىن قىسقۇچ تاللاڭ ھەمدە «ماقۇل» نى چېكىڭ. +NewFolderName=يېڭى قىسقۇچ -; ‫*** ‫"Welcome" ‫wizard ‫page -WelcomeLabel1=‫‮‫‫‮‫[name]نىڭ ‫قاچىلاش ‫يېتەكچىسىنى ‫ئىشلىتىشىڭىزنى ‫قارشى ‫ئالىمىز -WelcomeLabel2=‫‮‫‫‮‫مەزكۇر ‫قاچىلاش ‫يېتەكچىسى ‫سىزنىڭ ‫كومپيۇتېرىڭىزغا ‫[name/ver]نى ‫قاچىلىماقچى.%n%nمەشغۇلاتنى ‫داۋاملاشتۇرۇشتىن ‫ئىلگىرى ‫باشقا ‫بارلىق ‫دېتاللارنى ‫ئۆچۈرۈۋېتىشىڭىزنى ‫تەۋسىيە ‫قىلىمىز. +; *** "Welcome" wizard page +WelcomeLabel1=[name] نى قاچىلاش يېتەكچىسىگە خۇش كېلىپسىز +WelcomeLabel2=كومپيۇتېرىڭىزغا [name/ver] نى قاچىلايدۇ.%n%nداۋاملاشتۇرۇشتىن ئىلگىرى باشقا بارلىق دېتاللارنى تاقاش تەۋسىيە قىلىنىدۇ. -; ‫*** ‫"Password" ‫wizard ‫page -WizardPassword=‫‮‫‫‮‫پارول -PasswordLabel1=‫‮‫‫‮‫مەزكۇر ‫دېتال ‫پارول ‫بىلەن ‫قوغدالغان. -PasswordLabel3=‫‮‫‫‮‫پارولنى ‫كىرگۈزۈڭ ‫ھەمدە ‫"كېيىنكى ‫قەدەم"نى ‫چېكىڭ. ‫پارول ‫چوڭ-كىچىك ‫ھەرپنى ‫پەرقلەندۈرىدۇ. +; *** "Password" wizard page +WizardPassword=پارول +PasswordLabel1=بۇ قاچىلاش پارول بىلەن قوغدالغان. +PasswordLabel3=پارولنى كىرگۈزۈڭ ھەمدە «كېيىنكى» نى چېكىپ داۋاملاشتۇرۇڭ. پارول چوڭ-كىچىك ھەرپنى پەرقلەندۈرىدۇ. PasswordEditLabel=پارول(&P): -IncorrectPassword=‫‮‫‫‮‫كىرگۈزگەن ‫پارولىڭىز ‫توغرا ‫بولمىدى. ‫قايتا ‫سىناڭ. +IncorrectPassword=كىرگۈزگەن پارولىڭىز خاتا. قايتا سىناپ بېقىڭ. -; ‫*** ‫"License ‫Agreement" ‫wizard ‫page -WizardLicense=‫‮‫‫‮‫ئىجازەت ‫كېلىشىمنامىسى -LicenseLabel=‫‮‫‫‮‫تۆۋەندىكى ‫ئۇچۇرلارنى ‫ئوقۇڭ، ‫ئاندىن ‫كېيىنكى ‫قەدەمگە ‫ئۆتۈڭ. -LicenseLabel3=‫‮‫‫‮‫تۆۋەندىكى ‫ئىجازەت ‫كېلىشىمنامىسىنى ‫ئوقۇڭ. ‫سىز ‫كېلىشىمنامىدىكى ‫ماددىلارغا ‫قوشۇلغاندىلا، ‫قاچىلاشنى ‫داۋاملاشتۇرالايسىز. +; *** "License Agreement" wizard page +WizardLicense=ئىجازەت كېلىشىمى +LicenseLabel=داۋاملاشتۇرۇشتىن ئىلگىرى تۆۋەندىكى مۇھىم ئۇچۇرلارنى ئوقۇڭ. +LicenseLabel3=تۆۋەندىكى ئىجازەت كېلىشىمىنى ئوقۇڭ. قاچىلاشنى داۋاملاشتۇرۇشتىن ئىلگىرى چوقۇم بۇ كېلىشىمنىڭ ماددىلىرىغا قوشۇلۇشىڭىز كېرەك. LicenseAccepted=كېلىشىمگە قوشۇلىمەن(&A) LicenseNotAccepted=كېلىشىمگە قوشۇلمايمەن(&D) -; ‫*** ‫"Information" ‫wizard ‫pages +; *** "Information" wizard pages WizardInfoBefore=ئۇچۇر -InfoBeforeLabel=‫‮‫‫‮‫تۆۋەندىكى ‫ئۇچۇرلارنى ‫ئوقۇپ، ‫كېيىنكى ‫قەدەمگە ‫ئۆتۈڭ. -InfoBeforeClickLabel=‫‮‫‫‮‫قاچىلاشنى ‫داۋاملاشتۇرۇشقا ‫تەييارلىنىپ ‫بولۇپ، ‫"كېيىنكى ‫قەدەم"نى ‫چېكىڭ. -WizardInfoAfter=‫‮‫‫‮‫ئۇچۇر -InfoAfterLabel=‫‮‫‫‮‫تۆۋەندىكى ‫ئۇچۇرلارنى ‫ئوقۇپ، ‫كېيىنكى ‫قەدەمگە ‫ئۆتۈڭ. -InfoAfterClickLabel=‫‮‫‫‮‫قاچىلاشنى ‫داۋاملاشتۇرۇشقا ‫تەييارلىنىپ ‫بولۇپ، ‫"كېيىنكى ‫قەدەم"نى ‫چېكىڭ. +InfoBeforeLabel=داۋاملاشتۇرۇشتىن ئىلگىرى تۆۋەندىكى مۇھىم ئۇچۇرلارنى ئوقۇڭ. +InfoBeforeClickLabel=قاچىلاشنى داۋاملاشتۇرۇشقا تەييارلانغاندا، «كېيىنكى» نى چېكىڭ. +WizardInfoAfter=ئۇچۇر +InfoAfterLabel=داۋاملاشتۇرۇشتىن ئىلگىرى تۆۋەندىكى مۇھىم ئۇچۇرلارنى ئوقۇڭ. +InfoAfterClickLabel=قاچىلاشنى داۋاملاشتۇرۇشقا تەييارلانغاندا، «كېيىنكى» نى چېكىڭ. -; ‫*** ‫"User ‫Information" ‫wizard ‫page -WizardUserInfo=‫‮‫‫‮‫ئابۇنت ‫ئۇچۇرى -UserInfoDesc=‫‮‫‫‮‫ئۇچۇرىڭىزنى ‫تولدۇرۇڭ -UserInfoName=ئابۇنت نامى(&U): -UserInfoOrg=ئورگان نامى(&O): +; *** "User Information" wizard page +WizardUserInfo=ئىشلەتكۈچى ئۇچۇرى +UserInfoDesc=ئۇچۇرىڭىزنى كىرگۈزۈڭ. +UserInfoName=ئىشلەتكۈچى نامى(&U): +UserInfoOrg=ئىدارە(&O): UserInfoSerial=تەرتىپ نومۇرى(&S): -UserInfoNameRequired=‫‮‫‫‮‫ئابۇنت ‫نامىنى ‫چوقۇم ‫تولدۇرىسىز +UserInfoNameRequired=نامىنى كىرگۈزۈشىڭىز كېرەك. -; ‫*** ‫"Select ‫Destination ‫Location" ‫wizard ‫page -WizardSelectDir=‫‮‫‫‮‫قاچىلاش ‫ئورنىنى ‫تاللاڭ -SelectDirDesc=‫‮‫‫‮‫[name]نى ‫قەيەرگە ‫قاچىلايسىز؟ -SelectDirLabel3=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫[name]نى ‫تۆۋەندىكى ‫ھۆججەت ‫قىسقۇچقا ‫قاچىلايدۇ. -SelectDirBrowseLabel=‫‮‫‫‮‫"كېيىنكى ‫قەدەم"نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ. ‫ئەگەر ‫باشقا ‫ھۆججەت ‫قىسقۇچنى ‫تاللىماقچى ‫بولسىڭىز ‫"كۆرۈش"نى ‫چېكىڭ. -DiskSpaceMBLabel=‫‮‫‫‮‫دىسكا ‫بوشلۇقىڭىزدا ‫كەم ‫دېگەندە ‫[mb]مېگابايت(MB) ‫بوشلۇقىڭىز ‫بولۇشى ‫كېرەك. -CannotInstallToNetworkDrive=‫‮‫‫‮‫تور ‫قوزغاتقۇچىغا ‫قاچىلىيالمايدۇ. -CannotInstallToUNCPath=‫‮‫‫‮‫UNCيولىغا ‫قاچىلىيالايدۇ. -InvalidPath=‫‮‫‫‮‫دىسكا ‫بەلگىسىنى ‫ئۆز ‫ئىچىگە ‫ئالغان ‫مۇكەممەل ‫يولنى ‫تولدۇرۇشىڭىز ‫كېرەك، ‫مەسىلەن:%n%nC:\دېتال%n%nياكى ‫تۆۋەندىكى ‫فورماتتىكى ‫UNCيولى:%n%n\\مۇلازىمىتېر ‫نامى\ئورتاقلاشقان ‫مۇندەرىجە ‫نامى -InvalidDrive=‫‮‫‫‮‫سىز ‫تاللىغان ‫قوزغاتقۇچ ‫ياكى ‫UNC ‫مەۋجۇت ‫ئەمەس ‫ياكى ‫زىيارەت ‫قىلغىلى ‫بولمايدۇ.باشقا ‫بىرىنى ‫تاللاڭ. -DiskSpaceWarningTitle=‫‮‫‫‮‫دىسكا ‫بوشلۇقى ‫يېتىشمىدى -DiskSpaceWarning=‫‮‫‫‮‫ئاز ‫دېگەندە%1(KB) ‫بوشلۇق ‫بولغاندا ‫ئاندىن ‫قاچىلغىلى ‫بولىدۇ، ‫نۆۋەتتىكى ‫دىسكىدا%2(KB) ‫ئىشلەتكىلى ‫بولىدىغان ‫بوشلۇق ‫بار.%n%n ‫داۋاملاشتۇرامسىز؟ -DirNameTooLong=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫ياكى ‫يولى ‫بەك ‫ئۇزۇن ‫بولۇپ ‫كەتتى. -InvalidDirName=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫ئۈنۈمسىز. -BadDirName32=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫تۆۋەندىكى ‫ھەرپ-بەلگىلەرنى ‫ئۆز ‫ئىچىگە ‫ئالالمايدۇ:%n%n%1 -DirExistsTitle=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫قۇرۇلۇپ ‫بولغان -DirExists=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ%n%n%1%n%nقۇرۇلۇپ ‫بولغان. ‫راستتىنلا ‫مۇشۇ ‫ھۆججەت ‫قىسقۇچقا ‫قاچىلامسىز؟ -DirDoesntExistTitle=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫يوق -DirDoesntExist=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ%n%n%1%n%nيوق. ‫بۇ ‫ھۆججەت ‫قىسقۇچنى ‫قۇرامسىز؟ +; *** "Select Destination Location" wizard page +WizardSelectDir=قاچىلاش ئورنىنى تاللاش +SelectDirDesc=[name] نى قەيەرگە قاچىلاش كېرەك؟ +SelectDirLabel3=قاچىلاش پىروگراممىسى [name] نى تۆۋەندىكى قىسقۇچقا قاچىلايدۇ. +SelectDirBrowseLabel=«كېيىنكى» نى چېكىپ داۋاملاشتۇرۇڭ. باشقا قىسقۇچ تاللىماقچى بولسىڭىز، «كۆرۈش» نى چېكىڭ. +DiskSpaceGBLabel=كەم دېگەندە [gb]GB بىكار دىسكا بوشلۇقى تەلەپ قىلىنىدۇ. +DiskSpaceMBLabel=كەم دېگەندە [mb]MB بىكار دىسكا بوشلۇقى تەلەپ قىلىنىدۇ. +CannotInstallToNetworkDrive=قاچىلاش پىروگراممىسى تور دىسكىسىغا قاچىلىيالمايدۇ. +CannotInstallToUNCPath=قاچىلاش پىروگراممىسى UNC يولىغا قاچىلىيالمايدۇ. +InvalidPath=دىسكا بەلگىسى بار تولۇق يولىنى كىرگۈزۈشىڭىز كېرەك؛ مەسىلەن:%n%nC:\APP%n%nياكى تۆۋەندىكىدەك UNC يولى:%n%n\\server\share +InvalidDrive=سىز تاللىغان دىسكا ياكى UNC ئورتاقلىشىش يوق ياكى زىيارەت قىلغىلى بولمايدۇ. باشقا بىرىنى تاللاڭ. +DiskSpaceWarningTitle=دىسكا بوشلۇقى يېتىشمىدى +DiskSpaceWarning=قاچىلاش ئۈچۈن كەم دېگەندە %1KB بىكار بوشلۇق كېتىدۇ، بىراق تاللانغان دىسكىدا ئاران %2KB بىكار بوشلۇق بار.%n%nشۇنداقتىمۇ داۋاملاشتۇرامسىز؟ +DirNameTooLong=قىسقۇچ نامى ياكى يولى بەك ئۇزۇن. +InvalidDirName=قىسقۇچ نامى ئىناۋەتسىز. +BadDirName32=قىسقۇچ نامى تۆۋەندىكى ھەرپ-بەلگىلەرنى ئۆز ئىچىگە ئالالمايدۇ:%n%n%1 +DirExistsTitle=قىسقۇچ بار +DirExists=قىسقۇچ:%n%n%1%n%nباركەن. شۇنداقتىمۇ مۇشۇ قىسقۇچقا قاچىلامسىز؟ +DirDoesntExistTitle=قىسقۇچ يوق +DirDoesntExist=قىسقۇچ:%n%n%1%n%nيوقكەن. بۇ قىسقۇچنى قۇرامسىز؟ -; ‫*** ‫"Select ‫Components" ‫wizard ‫page -WizardSelectComponents=‫‮‫‫‮‫قىستۇرما ‫تاللاش -SelectComponentsDesc=‫‮‫‫‮‫قايسى ‫قىستۇرمىلارنى ‫قاچىلايسىز؟ -SelectComponentsLabel2=‫‮‫‫‮‫قاچىلىماقچى ‫بولغان ‫قىستۇرمىنى ‫تاللاڭ، ‫قاچىلىمايدىغان ‫قىستۇرمىلارنى ‫تازىلىۋىتىڭ. ‫تەييارلىنىپ ‫بولغاندىن ‫كېيىن ‫"كېيىنكى ‫قەدەم"نى ‫چېكىڭ. -FullInstallation=‫‮‫‫‮‫ھەممىنى ‫قاچىلاش -; ‫if ‫possible ‫don't ‫translate ‫'Compact' ‫as ‫'Minimal' ‫(I ‫mean ‫'Minimal' ‫in ‫your ‫language) -CompactInstallation=‫‮‫‫‮‫ئاددىي ‫قاچىلاش -CustomInstallation=‫‮‫‫‮‫ئۆزى ‫بەلگىلەپ ‫قاچىلاش -NoUninstallWarningTitle=‫‮‫‫‮‫قىستۇرما ‫بار -NoUninstallWarning=‫‮‫‫‮‫تۆۋەندىكى ‫سەپلىمىلەرنى ‫قاچىلاپ ‫بولۇپسىز:%n%n%1%n%n ‫تاللاشنى ‫بىكار ‫قىلىڭ.%n%n ‫داۋاملاشتۇرامسىز؟ -ComponentSize1=‫‮‫‫‮‫%1كىلوبايت(KB) -ComponentSize2=‫‮‫‫‮‫%1مېگابايت(MB) -ComponentsDiskSpaceMBLabel=‫‮‫‫‮‫بۇ ‫تۈرگە ‫ئەڭ ‫ئاز ‫بولغاندا ‫[mb](MB) ‫بوشلۇق ‫كېتىدۇ. +; *** "Select Components" wizard page +WizardSelectComponents=بىرىكمە تاللاش +SelectComponentsDesc=قايسى بىرىكمىلەرنى قاچىلاش كېرەك؟ +SelectComponentsLabel2=قاچىلايدىغان بىرىكمىلەرنى تاللاڭ؛ قاچىلىمايدىغان بىرىكمىلەرنى تاللىماڭ. داۋاملاشتۇرۇشقا تەييارلانغاندا «كېيىنكى» نى چېكىڭ. +FullInstallation=تولۇق قاچىلاش +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=ئىخچام قاچىلاش +CustomInstallation=ئىختىيارى قاچىلاش +NoUninstallWarningTitle=بىرىكمە بار +NoUninstallWarning=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا تۆۋەندىكى بىرىكمىلەرنىڭ قاچىلانغانلىقىنى بايقىدى:%n%n%1%n%nبۇ بىرىكمىلەرنى تاللىمىغاندا ئۇلارنى چىقىرىۋەتمەيدۇ.%n%nشۇنداقتىمۇ داۋاملاشتۇرامسىز؟ +ComponentSize1=%1KB +ComponentSize2=%1MB +ComponentsDiskSpaceGBLabel=نۆۋەتتىكى تاللاش كەم دېگەندە [gb]GB دىسكا بوشلۇقى تەلەپ قىلىدۇ. +ComponentsDiskSpaceMBLabel=نۆۋەتتىكى تاللاش كەم دېگەندە [mb]MB دىسكا بوشلۇقى تەلەپ قىلىدۇ. -; ‫*** ‫"Select ‫Additional ‫Tasks" ‫wizard ‫page -WizardSelectTasks=‫‮‫‫‮‫قوشۇمچە ‫ۋەزىپە ‫تاللاڭ -SelectTasksDesc=‫‮‫‫‮‫قايسى ‫قوشۇمچە ‫ۋەزىپىلەرنى ‫ئىجرا ‫قىلدۇرىسىز؟ -SelectTasksLabel2=‫‮‫‫‮‫[name]نى ‫قاچىلاۋاتقان ‫ۋاقىتتا ‫ئىجرا ‫قىلدۇرماقچى ‫بولغان ‫ۋەزىپىلەرنى ‫تاللاڭ، ‫ئاندىن ‫"كېيىنكى ‫قەدەم"نى ‫چېكىڭ. +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=قوشۇمچە ۋەزىپىلەرنى تاللاش +SelectTasksDesc=قايسى قوشۇمچە ۋەزىپىلەرنى قىلىش كېرەك؟ +SelectTasksLabel2=[name] نى قاچىلاۋاتقاندا قىلىدىغان ۋەزىپىلەرنى تاللاڭ ھەمدە «كېيىنكى» نى چېكىڭ. -; ‫*** ‫"Select ‫Start ‫Menu ‫Folder" ‫wizard ‫page -WizardSelectProgramGroup=‫‮‫‫‮‫باشلاش ‫تىزىملىكىدىكى ‫ھۆججەت ‫قىسقۇچنى ‫تاللاڭ -SelectStartMenuFolderDesc=‫‮‫‫‮‫دېتالنىڭ ‫قىسقا ‫يولىنى ‫قەيەرگە ‫قۇرىسىز؟ -SelectStartMenuFolderLabel3=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫تۆۋەندىكى ‫باشلاش ‫تىزىملىكىدىكى ‫ھۆججەت ‫قىسقۇچقا ‫دېتالنىڭ ‫قىسقا ‫يولىنى ‫قۇرىدۇ. -SelectStartMenuFolderBrowseLabel=‫‮‫‫‮‫"كېيىنكى ‫قەدەم"نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ. ‫ئەگەر ‫باشقا ‫ھۆججەت ‫قىسقۇچنى ‫تاللىماقچى ‫بولسىڭىز ‫"كۆرۈش"نى ‫چېكىڭ. -MustEnterGroupName=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچنىڭ ‫نامىنى ‫چوقۇم ‫تولدۇرۇشىڭىز ‫كېرەك -GroupNameTooLong=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫ياكى ‫يولى ‫بەك ‫ئۇزۇن ‫بولۇپ ‫كەتتى. -InvalidGroupName=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫ئۈنۈمسىز. -BadGroupName=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫نامى ‫تۆۋەندىكى ‫ھەرپ-بەلگىلەرنى ‫ئۆز ‫ئىچىگە ‫ئالالمايدۇ:%n%n%1 -NoProgramGroupCheck2=باشلاش تىزىملىكىگە ھۆججەت قىسقۇچ قۇرمايمەن(&D) +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=باشلاش تىزىملىكىگە قىسقۇچ تاللاش +SelectStartMenuFolderDesc=پىروگراممىنىڭ قىسقا يولىنى قەيەرگە قۇرۇش كېرەك؟ +SelectStartMenuFolderLabel3=قاچىلاش پىروگراممىسى باشلاش تىزىملىكىدىكى تۆۋەندىكى قىسقۇچقا پىروگراممىنىڭ قىسقا يولىنى قۇرىدۇ. +SelectStartMenuFolderBrowseLabel=«كېيىنكى» نى چېكىپ داۋاملاشتۇرۇڭ. باشقا قىسقۇچ تاللىماقچى بولسىڭىز، «كۆرۈش» نى چېكىڭ. +MustEnterGroupName=قىسقۇچ نامىنى كىرگۈزۈشىڭىز كېرەك. +GroupNameTooLong=قىسقۇچ نامى ياكى يولى بەك ئۇزۇن. +InvalidGroupName=قىسقۇچ نامى ئىناۋەتسىز. +BadGroupName=قىسقۇچ نامى تۆۋەندىكى ھەرپ-بەلگىلەرنى ئۆز ئىچىگە ئالالمايدۇ:%n%n%1 +NoProgramGroupCheck2=باشلاش تىزىملىكىگە قىسقۇچ قۇرمايمەن(&D) -; ‫*** ‫"Ready ‫to ‫Install" ‫wizard ‫page -WizardReady=‫‮‫‫‮‫قاچىلاش ‫تاماملىنىشقا ‫تەييارلاندى -ReadyLabel1=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫تاماملىنىشقا ‫تەييارلاندى، ‫سىزنىڭ ‫كومپيۇتېرىڭىزغا ‫[name]نى ‫قاچىلاشنى ‫باشلايدۇ. -ReadyLabel2a=تەييارلىق پۈتكەن بولسا ‫‮‫‫‮‫"قاچىلاش"نى ‫چېكىپ ‫قاچىلاشنى ‫باشلاڭ. ‫ئەگەر ‫تەڭشەشنى ‫ئۆزگەرتمەكچى ‫ياكى ‫تەكشۈرمەكچى ‫بولسىڭىز ‫"ئالدىنقى ‫قەدەم"نى ‫چېكىڭ. -ReadyLabel2b=‫‮‫‫‮‫"قاچىلاش"نى ‫چېكىپ ‫قاچىلاشنى ‫باشلاڭ. -ReadyMemoUserInfo=‫‮‫‫‮‫ئابۇنت ‫ئۇچۇرى: -ReadyMemoDir=‫‮‫‫‮‫قاچىلاش ‫ئورنى: -ReadyMemoType=‫‮‫‫‮‫قاچىلاش ‫تىپى: -ReadyMemoComponents=‫‮‫‫‮‫تاللانغان ‫قىستۇرمىلار: -ReadyMemoGroup=‫‮‫‫‮‫باشلاش ‫تىزىملىكىدىكى ‫ھۆججەت ‫قىسقۇچ: -ReadyMemoTasks=‫‮‫‫‮‫قوشۇمچە ‫ۋەزىپە: +; *** "Ready to Install" wizard page +WizardReady=قاچىلاشقا تەييارلاندى +ReadyLabel1=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا [name] نى قاچىلاشقا تەييارلاندى. +ReadyLabel2a=قاچىلاشنى داۋاملاشتۇرۇش ئۈچۈن «قاچىلاش» نى چېكىڭ. تەڭشەكلەرنى تەكشۈرمەكچى ياكى ئۆزگەرتمەكچى بولسىڭىز «قايتىش» نى چېكىڭ. +ReadyLabel2b=قاچىلاشنى داۋاملاشتۇرۇش ئۈچۈن «قاچىلاش» نى چېكىڭ. +ReadyMemoUserInfo=ئىشلەتكۈچى ئۇچۇرى: +ReadyMemoDir=قاچىلاش ئورنى: +ReadyMemoType=قاچىلاش تىپى: +ReadyMemoComponents=تاللانغان بىرىكمىلەر: +ReadyMemoGroup=باشلاش تىزىملىكىدىكى قىسقۇچ: +ReadyMemoTasks=قوشۇمچە ۋەزىپىلەر: -; ‫*** ‫"Preparing ‫to ‫Install" ‫wizard ‫page -WizardPreparing=‫‮‫‫‮‫قاچىلاشقا ‫تەييارلاندى -PreparingDesc=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫سىزنىڭ ‫كومپيۇتېرىڭىزغا ‫[name]نى ‫قاچىلاشقا ‫تەييارلىنىۋاتىدۇ. -PreviousInstallNotCompleted=‫‮‫‫‮‫ئالدىنقى ‫قېتىملىق ‫دېتال ‫قاچىلاش/ئۆچۈرۈش ‫تاماملىنالمىدى. ‫سىز ‫كومپيۇتېرنى ‫قايتا ‫قوزغىتىپ ‫ئالدىنقى ‫قېتىملىق ‫قاچىلاشنى ‫تاماملىشىڭىز ‫كېرەك.%n%nكومپيۇتېر ‫قايتا ‫قوزغالغاندىن ‫كېيىن، ‫قاچىلاش ‫يېتەكچىسىنى ‫قايتا ‫ئىجرا ‫قىلىپ ‫[name]نى ‫قاچىلاڭ. -CannotContinue=‫‮‫‫‮‫قاچىلاش ‫داۋاملىشالمايدۇ. ‫"ئىناۋەتسىز"نى ‫چېكىپ ‫چېكىنىڭ. -ApplicationsFound=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫يېڭىلاشتا ‫ئىشلىتىدىغان ‫ھۆججەتنى ‫باشقا ‫دېتال ‫ئىشلىتىۋېتىپتۇ. ‫قاچىلاش ‫يېتەكچىسىنىڭ ‫بۇ ‫پىروگراممىلارنى ‫مەجبۇرىي ‫ئۆچۈرۋېتىشىگە ‫يول ‫قويىشىڭىز ‫كېرەك. -ApplicationsFound2=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫يېڭىلاشتا ‫ئىشلىتىدىغان ‫ھۆججەتنى ‫باشقا ‫دېتال ‫ئىشلىتىۋېتىپتۇ. ‫قاچىلاش ‫يېتەكچىسىنىڭ ‫بۇ ‫پىروگراممىلارنى ‫مەجبۇرىي ‫ئۆچۈرۋېتىشىگە ‫يول ‫قويىشىڭىز ‫كېرەك. ‫قاچىلاش ‫تۈگىگەندە ‫بۇ ‫پىروگراممىلارنى ‫قايتىدىن ‫قوزغىتىدۇ. -CloseApplications=دېتالنى ئاپتوماتىك ئۆچۈرسۇن(&A) -DontCloseApplications=دېتالنى ئاپتوماتىك ئۆچۈرمىسۇن(&D) -ErrorCloseApplications=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫بارلىق ‫پىروگراممىلارنى ‫ئاپتوماتىك ‫ئۆچۈرەلمىدى. ‫كېيىنكى ‫باسقۇچقا ‫ئۆتۈشتى ‫ئاۋۋال ‫بۇ ‫پىروگراممىلارنى ‫چوقۇم ‫ئۆچۈرۋېتىشىڭىز ‫كېرەك. +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel=قوشۇمچە ھۆججەتلەرنى چۈشۈرۈۋاتىدۇ... +ButtonStopDownload=چۈشۈرۈشنى توختىتىش(&S) +StopDownload=چۈشۈرۈشنى راستتىنلا توختىتامسىز؟ +ErrorDownloadAborted=چۈشۈرۈش توختىتىلدى +ErrorDownloadFailed=چۈشۈرەلمىدى: %1 %2 +ErrorDownloadSizeFailed=چوڭلۇقىغا ئېرىشەلمىدى: %1 %2 +ErrorFileHash1=ھۆججەت Hash نى تەكشۈرەلمىدى: %1 +ErrorFileHash2=ئىناۋەتسىز ھۆججەت Hash: كۈتكىنى %1، تېپىلغىنى %2 +ErrorProgress=ئىناۋەتسىز ئىلگىرىلەش: %1، جەمئىي: %2 +ErrorFileSize=ئىناۋەتسىز ھۆججەت چوڭلۇقى: كۈتكىنى %1، تېپىلغىنى %2 -; ‫*** ‫"Installing" ‫wizard ‫page -WizardInstalling=‫‮‫‫‮‫قاچىلاۋاتىدۇ -InstallingLabel=‫‮‫‫‮‫سەل ‫ساقلاڭ، ‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرىڭىزغا ‫[name]نى ‫قاچىلاۋاتىدۇ. +; *** "Preparing to Install" wizard page +WizardPreparing=قاچىلاشقا تەييارلىنىۋاتىدۇ +PreparingDesc=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا [name] نى قاچىلاشقا تەييارلىنىۋاتىدۇ. +PreviousInstallNotCompleted=ئالدىنقى پىروگراممىنى قاچىلاش ياكى چىقىرىۋېتىش تاماملانمىدى. قاچىلاشنى تاماملاش ئۈچۈن كومپيۇتېرىڭىزنى قايتا قوزغىتىشىڭىز كېرەك.%n%nكومپيۇتېرىڭىز قايتا قوزغالغاندىن كېيىن، قاچىلاش پىروگراممىسىنى قايتا ئىجرا قىلىپ [name] نى قاچىلاشنى تاماملاڭ. +CannotContinue=قاچىلاش پىروگراممىسىنى داۋاملاشتۇرغىلى بولمايدۇ. چېكىنىش ئۈچۈن «ئىناۋەتسىز» نى چېكىڭ. +ApplicationsFound=تۆۋەندىكى دېتاللار قاچىلاش پىروگراممىسى يېڭىلايدىغان ھۆججەتلەرنى ئىشلىتىۋاتىدۇ. قاچىلاش پىروگراممىسىنىڭ بۇ دېتاللارنى ئاپتوماتىك تاقىشىغا يول قويۇشىڭىز تەۋسىيە قىلىنىدۇ. +ApplicationsFound2=تۆۋەندىكى دېتاللار قاچىلاش پىروگراممىسى يېڭىلايدىغان ھۆججەتلەرنى ئىشلىتىۋاتىدۇ. قاچىلاش پىروگراممىسىنىڭ بۇ دېتاللارنى ئاپتوماتىك تاقىشىغا يول قويۇشىڭىز تەۋسىيە قىلىنىدۇ. قاچىلاش تاماملانغاندىن كېيىن، قاچىلاش پىروگراممىسى بۇ دېتاللارنى قايتا قوزغىتىشقا ئۇرۇنىدۇ. +CloseApplications=دېتاللارنى ئاپتوماتىك تاقاش(&A) +DontCloseApplications=دېتاللارنى تاقىماسلىق(&D) +ErrorCloseApplications=قاچىلاش پىروگراممىسى بارلىق دېتاللارنى ئاپتوماتىك تاقىيالمىدى. داۋاملاشتۇرۇشتىن بۇرۇن بۇ دېتاللارنى تاقاش تەۋسىيە قىلىنىدۇ. +PrepareToInstallNeedsRestart=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزنى قايتا قوزغىتىشى كېرەك. كومپيۇتېرىڭىز قايتا قوزغالغاندىن كېيىن، قاچىلاش پىروگراممىسىنى قايتا ئىجرا قىلىپ [name] نى قاچىلاشنى تاماملاڭ.%n%nھازىرلا قايتا قوزغىتامسىز؟ -; ‫*** ‫"Setup ‫Completed" ‫wizard ‫page -FinishedHeadingLabel=‫‮‫‫‮‫[name]نى ‫قاچىلاش ‫تامام -FinishedLabelNoIcons=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرىڭىزغا ‫[name]نى ‫قاچىلاپ ‫بولدى. -FinishedLabel=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرىڭىزغا ‫[name]نى ‫قاچىلاپ ‫بولدى. ‫سىز ‫قۇرىۋالغان ‫قىسقا ‫يول ‫ئارقىلىق ‫بۇ ‫دېتالنى ‫ئاچالايسىز. -ClickFinish=‫‮‫‫‮‫"تامام"نى ‫چېكىپ ‫قاچىلاشنى ‫تاماملاڭ. -FinishedRestartLabel=‫‮‫‫‮‫[name]نى ‫قاچىلاشنى ‫تاماملاش ‫ئۈچۈن، ‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرىڭىزنى ‫ ‫قايتا ‫قوزغىتىشى ‫كېرەك. ‫ھازىرلا ‫قايتا ‫قوزغىتامسىز؟ -FinishedRestartMessage=‫‮‫‫‮‫[name]نى ‫قاچىلاشنى ‫تاماملاش ‫ئۈچۈن، ‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرىڭىزنى ‫ ‫قايتا ‫قوزغىتىشى ‫كېرەك.%n%nھازىرلا ‫قايتا ‫قوزغىتامسىز؟ -ShowReadmeCheck=‫‮‫‫‮‫ھەئە، ‫تونۇشتۇرۇش ‫ھۆججىتىنى ‫ئوقۇيمەن +; *** "Installing" wizard page +WizardInstalling=قاچىلاۋاتىدۇ +InstallingLabel=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا [name] نى قاچىلاۋاتىدۇ، سەل ساقلاڭ. + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=[name] نى قاچىلاش تامام +FinishedLabelNoIcons=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا [name] نى قاچىلاپ بولدى. +FinishedLabel=قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزغا [name] نى قاچىلاپ بولدى. قاچىلانغان قىسقا يوللارنى تاللاش ئارقىلىق دېتالنى قوزغىتالايسىز. +ClickFinish=«تامام» نى چېكىپ قاچىلاش پىروگراممىسىدىن چېكىنىڭ. +FinishedRestartLabel=[name] نى قاچىلاشنى تاماملاش ئۈچۈن، قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزنى قايتا قوزغىتىشى كېرەك. ھازىرلا قايتا قوزغىتامسىز؟ +FinishedRestartMessage=[name] نى قاچىلاشنى تاماملاش ئۈچۈن، قاچىلاش پىروگراممىسى كومپيۇتېرىڭىزنى قايتا قوزغىتىشى كېرەك.%n%nھازىرلا قايتا قوزغىتامسىز؟ +ShowReadmeCheck=ھەئە، چۈشەندۈرۈش ھۆججىتىنى ئوقۇيمەن YesRadio=ھەئە، كومپيۇتېرنى ھازىرلا قايتا قوزغىتىمەن(&Y) -NoRadio=ياق، سەل تۇرۇپ ئۆزۈم قايتا قوزغىتىمەن(&N) -; ‫used ‫for ‫example ‫as ‫'Run ‫MyProg.exe' -RunEntryExec=‫‮‫‫‮‫%1نى ‫ئىجرا ‫قىلىش -; ‫used ‫for ‫example ‫as ‫'View ‫Readme.txt' -RunEntryShellExec=‫‮‫‫‮‫تەكشۈرۈۋاتىدۇ ‫%1 +NoRadio=ياق، كومپيۇتېرنى سەل تۇرۇپ قايتا قوزغىتىمەن(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec=%1 نى ئىجرا قىلىش +; used for example as 'View Readme.txt' +RunEntryShellExec=%1 نى كۆرۈش -; ‫*** ‫"Setup ‫Needs ‫the ‫Next ‫Disk" ‫stuff -ChangeDiskTitle=‫‮‫‫‮‫تاللانغان ‫دىسكىنى ‫ئۆزگەرتىڭ -SelectDiskLabel2=‫‮‫‫‮‫دىسكىنى ‫سېلىپ%1 ‫"مۇقىملاش" ‫نى ‫چېكىڭ.%n%n ‫ئەگەر ‫دىسكىدا ‫تۆۋەندىكى ‫ھۆججەت ‫قىسقۇچ ‫يوق ‫بولسا، ‫"كۆرۈش" ‫دىن ‫تاللاڭ. -PathLabel=مۇندەرىجە(&P): -FileNotInDir2=‫‮‫‫‮‫ھۆججەت"%1" ‫"%2"نىڭ ‫ئىچىدە ‫يوقكەن. ‫توغرا ‫بولغان ‫دىسكىنى ‫سېلىڭ ‫ياكى ‫توغرا ‫بولغان ‫ھۆججەت ‫قىسقۇچنى ‫تاللاڭ. -SelectDirectoryLabel=‫‮‫‫‮‫بىر ‫دىسكىنى ‫تاللاڭ +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=قاچىلاش پىروگراممىسىغا كېيىنكى دىسكا لازىم +SelectDiskLabel2=%1 دىسكىنى سېلىپ، «ماقۇل» نى چېكىڭ.%n%nئەگەر بۇ دىسكىدىكى ھۆججەتلەرنى تۆۋەندىكى قىسقۇچلاردىن باشقىسىدا تاپقىلى بولسا، توغرا يولىنى كىرگۈزۈڭ ياكى «كۆرۈش» نى چېكىڭ. +PathLabel=يولى(&P): +FileNotInDir2=«%1» ھۆججىتى «%2» دىن تېپىلمىدى. توغرا دىسكىنى سېلىڭ ياكى باشقا قىسقۇچنى تاللاڭ. +SelectDirectoryLabel=كېيىنكى دىسكىنىڭ ئورنىنى بەلگىلەڭ. -; ‫*** ‫Installation ‫phase ‫messages -SetupAborted=‫‮‫‫‮‫قاچىلاش ‫تولۇق ‫تاماملانمىدى.%n%nتۆۋەندىكى ‫مەسىلىلەرنى ‫ھەل ‫قىلىپ ‫قايتا ‫قاچىلاڭ. -EntryAbortRetryIgnore=‫‮‫‫‮‫"قايتا ‫سىناش" ‫نى ‫چېكىپ ‫قايتا ‫سىناڭ، ‫"ئۆتكۈزۋېتىش" ‫نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ، ‫"ئاخىرلاشتۇرۇش" ‫نى ‫چېكىپ ‫قاچىلاشنى ‫ئاخىرلاشتۇرۇڭ. +; *** Installation phase messages +SetupAborted=قاچىلاش پىروگراممىسى تاماملانمىدى.%n%nمەسىلىنى تۈزىتىپ، قاچىلاش پىروگراممىسىنى قايتا ئىجرا قىلىڭ. +AbortRetryIgnoreSelectAction=مەشغۇلات تاللاش +AbortRetryIgnoreRetry=قايتا سىناش(&T) +AbortRetryIgnoreIgnore=خاتالىققا پەرۋا قىلماي داۋاملاشتۇرۇش(&I) +AbortRetryIgnoreCancel=قاچىلاشنى بىكار قىلىش -; ‫*** ‫Installation ‫status ‫messages -StatusClosingApplications=‫‮‫‫‮‫دېتالنى ‫ئۆچۈرۈۋاتىدۇ… -StatusCreateDirs=‫‮‫‫‮‫ھۆججەت ‫قىسقۇچ ‫قۇرۇۋاتىدۇ… -StatusExtractFiles=‫‮‫‫‮‫ھۆججەتنى ‫چىقىرىۋاتىدۇ… -StatusCreateIcons=‫‮‫‫‮‫قىسقا ‫يولىنى ‫قۇرۇۋاتىدۇ… -StatusCreateIniEntries=‫‮‫‫‮‫INI ‫كۆرسەتكۈچىنى ‫قۇرۇۋاتىدۇ… -StatusCreateRegistryEntries=‫‮‫‫‮‫تىزىملاش ‫جەدۋەل ‫كۆرسەتكۈچىنى ‫قۇرۇۋاتىدۇ… -StatusRegisterFiles=‫‮‫‫‮‫تىزىملاش ‫جەدۋەل ‫تۈرىنى ‫قۇرۇۋاتىدۇ… -StatusSavingUninstall=‫‮‫‫‮‫ئۆچۈرۈش ‫ئۇچۇرىنى ‫ساقلاۋاتىدۇ… -StatusRunProgram=‫‮‫‫‮‫قاچىلاشنى ‫تاماملاۋاتىدۇ… -StatusRestartingApplications=‫‮‫‫‮‫دېتالنى ‫قايتا ‫قوزغىتىۋاتىدۇ… -StatusRollback=‫‮‫‫‮‫ئۆزگەرتىشنى ‫بىكار ‫قىلىۋاتىدۇ… +; *** Installation status messages +StatusClosingApplications=دېتاللارنى تاقاۋاتىدۇ... +StatusCreateDirs=مۇندەرىجىلەرنى قۇرۇۋاتىدۇ... +StatusExtractFiles=ھۆججەتلەرنى يېيىۋاتىدۇ... +StatusCreateIcons=قىسقا يوللىرىنى قۇرۇۋاتىدۇ... +StatusCreateIniEntries=INI مەزمۇنلىرىنى قۇرۇۋاتىدۇ... +StatusCreateRegistryEntries=تىزىملاش جەدۋىلىنى قۇرۇۋاتىدۇ... +StatusRegisterFiles=ھۆججەتلەرنى تىزىملاۋاتىدۇ... +StatusSavingUninstall=چىقىرىۋېتىش ئۇچۇرىنى ساقلاۋاتىدۇ... +StatusRunProgram=قاچىلاشنى تاماملاۋاتىدۇ... +StatusRestartingApplications=دېتاللارنى قايتا قوزغىتىۋاتىدۇ... +StatusRollback=ئۆزگەرتىشلەرنى قايتۇرۇۋاتىدۇ... -; ‫*** ‫Misc. ‫errors -ErrorInternal2=‫‮‫‫‮‫ئىچكى ‫خاتالىق:%1 -ErrorFunctionFailedNoCode=‫‮‫‫‮‫%1 ‫مەغلۇپ ‫بولدى -ErrorFunctionFailed=‫‮‫‫‮‫%1 ‫مەغلۇپ ‫بولدى، ‫خاتالىق ‫نومۇرى ‫%2 -ErrorFunctionFailedWithMessage=‫‮‫‫‮‫%1مەغلۇپ ‫بولدى، ‫خاتالىق ‫نومۇرى ‫%2.%n%3 -ErrorExecutingProgram=‫‮‫‫‮‫ئىجرا ‫بولمىغان ‫دېتال:%n%1 +; *** Misc. errors +ErrorInternal2=ئىچكى خاتالىق: %1 +ErrorFunctionFailedNoCode=%1 مەغلۇپ بولدى +ErrorFunctionFailed=%1 مەغلۇپ بولدى؛ كودى %2 +ErrorFunctionFailedWithMessage=%1 مەغلۇپ بولدى؛ كودى %2.%n%3 +ErrorExecutingProgram=ئىجرا قىلالمىغان ھۆججەت:%n%1 -; ‫*** ‫Registry ‫errors -ErrorRegOpenKey=‫‮‫‫‮‫تىزىملاش ‫جەدۋىلىنى ‫ئاچقاندا ‫يۈز ‫بەرگەن ‫خاتالىق:%n%1\%2 -ErrorRegCreateKey=‫‮‫‫‮‫تىزىملاش ‫جەدۋىلىنى ‫قۇرغاندا ‫يۈز ‫بەرگەن ‫خاتالىق:%n%1\%2 -ErrorRegWriteKey=‫‮‫‫‮‫تىزىملاش ‫جەدۋىلىنى ‫يازغاندا ‫يۈز ‫بەرگەن ‫خاتالىق:%n%1\%2 +; *** Registry errors +ErrorRegOpenKey=تىزىملاش جەدۋىلىنى ئېچىش خاتالىقى:%n%1\%2 +ErrorRegCreateKey=تىزىملاش جەدۋىلىنى قۇرۇش خاتالىقى:%n%1\%2 +ErrorRegWriteKey=تىزىملاش جەدۋىلىنى يېزىش خاتالىقى:%n%1\%2 -; ‫*** ‫INI ‫errors -ErrorIniEntry=‫‮‫‫‮‫ھۆججەت"%1"نىڭINI ‫تۈرىنى ‫قۇرۇشتا ‫خاتالىق ‫كۆرۈلدى. +; *** INI errors +ErrorIniEntry=«%1» ھۆججىتىگە INI مەزمۇنىنى قۇرۇش خاتالىقى. -; ‫*** ‫File ‫copying ‫errors -FileAbortRetryIgnore=‫‮‫‫‮‫"قايتا ‫سىناش" ‫نى ‫چېكىپ ‫قايتا ‫سىناڭ، ‫"ئۆتكۈزۋېتىش" ‫نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ(تەۋسىيە ‫قىلىنمايدۇ)، ‫"ئاخىرلاشتۇرۇش" ‫نى ‫چېكىپ ‫قاچىلاشنى ‫ئاخىرلاشتۇرۇڭ. -FileAbortRetryIgnore2=‫‮‫‫‮‫"قايتا ‫سىناش" ‫نى ‫چېكىپ ‫قايتا ‫سىناڭ، ‫"ئۆتكۈزۋېتىش" ‫نى ‫چېكىپ ‫داۋاملاشتۇرۇڭ(تەۋسىيە ‫قىلىنمايدۇ)، ‫"ئاخىرلاشتۇرۇش" ‫نى ‫چېكىپ ‫قاچىلاشنى ‫ئاخىرلاشتۇرۇڭ. -SourceIsCorrupted=‫‮‫‫‮‫ھۆججەت ‫بۇزۇلۇپ ‫كېتىپتۇ -SourceDoesntExist=‫‮‫‫‮‫ھۆججەت ‫"%1" ‫مەۋجۇت ‫ئەمەسكەن -ExistingFileReadOnly=‫‮‫‫‮‫ھازىر ‫بار ‫بولغان ‫ھۆججەتنى ‫پەقەت ‫ئوقۇغىلى ‫بولىدىكەن.%n%n ‫ھۆججەتنىڭ ‫پەقەت ‫ئوقۇغىلى ‫بولىدىغان ‫خاسلىقىنى ‫ئېلىۋېتىپ ‫"قايتا ‫سىناش" ‫نى ‫چېكىڭ, ‫ياكى ‫"ئۆتكۈزۋېتىش" ‫نى ‫چېكىپ ‫ئاتلاپ ‫ئۆتۈپ ‫كېتىڭ, ‫ياكى ‫"ئاخىرلاشتۇرۇش" ‫نى ‫چېكىپ ‫قاچىلاشنى ‫ئاخىرلاشتۇرۇڭ. -ErrorReadingExistingDest=‫‮‫‫‮‫ھۆججەت ‫ئوقۇشتا ‫خاتالىق ‫كۆرۈلدى: -FileExists=‫‮‫‫‮‫ھۆججەت ‫مەۋجۇتكەن.%n%n ‫باستۇرۋېتەمسىز؟ -ExistingFileNewer=‫‮‫‫‮‫ئەسلىدە ‫بار ‫ھۆججەت ‫نەشرى ‫ھازىر ‫قاچىلىماقچى ‫بولغان ‫ھۆججەت ‫نەشرىدىن ‫يېڭىكەن. ‫چوقۇم ‫ساقلاپ ‫قېلىشىڭىز ‫كېرەك.%n%nساقلاپ ‫قالامسىز؟ -ErrorChangingAttr=‫‮‫‫‮‫ھۆججەت ‫خاسلىقىنى ‫ئۆزگەرتىشتە ‫خاتالىق ‫كۆرۈلدى: -ErrorCreatingTemp=‫‮‫‫‮‫ھۆججەت ‫قۇرۇش ‫مەغلۇپ ‫بولدى: -ErrorReadingSource=‫‮‫‫‮‫ھۆججەت ‫ئوقۇشتا ‫خاتالىق ‫كۆرۈلدى: -ErrorCopying=‫‮‫‫‮‫ھۆججەت ‫كۆچۈرۈشتە ‫خاتالىق ‫كۆرۈلدى: -ErrorReplacingExistingFile=‫‮‫‫‮‫ھۆججەت ‫ئالماشتۇرۇش ‫مەغلۇپ ‫بولدى: -ErrorRestartReplace=‫‮‫‫‮‫قايتا ‫ئالماشتۇرۇش ‫مەغلۇپ ‫بولدى: -ErrorRenamingTemp=‫‮‫‫‮‫نىشان ‫مۇندەرىجىنىڭ ‫نامىنى ‫ئۆزگەرتىشتە ‫خاتالىق ‫كۆرۈلدى: -ErrorRegisterServer=‫‮‫‫‮‫تىزىملاش ‫مەغلۇپ ‫بولغان ‫كونتروللار ‫(DLL/OCX):%1 -ErrorRegSvr32Failed=‫‮‫‫‮‫RegSvr32 ‫نى ‫ئىجرا ‫قىلىش ‫مەغلۇپ ‫بولدى، ‫قايتۇرغان ‫قىممەت:%1 -ErrorRegisterTypeLib=‫‮‫‫‮‫تىزىملاش ‫مەغلۇپ ‫بولغان ‫تۈرلەر:%1 +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=بۇ ھۆججەتنى ئۆتكۈزۈۋېتىش(&S) (تەۋسىيە قىلىنمايدۇ) +FileAbortRetryIgnoreIgnoreNotRecommended=خاتالىققا پەرۋا قىلماي داۋاملاشتۇرۇش(&I) (تەۋسىيە قىلىنمايدۇ) +SourceIsCorrupted=مەنبە ھۆججەت بۇزۇلغان +SourceDoesntExist=مەنبە ھۆججەت «%1» يوق +ExistingFileReadOnly2=بار ھۆججەتنى پەقەت ئوقۇشقىلا بولىدىغان بولغاچقا ئالماشتۇرغىلى بولمايدۇ. +ExistingFileReadOnlyRetry=ئوقۇشقىلا بولىدىغان خاسلىقنى چىقىرىۋېتىپ قايتا سىناش(&R) +ExistingFileReadOnlyKeepExisting=بار ھۆججەتنى ساقلاپ قىلىش(&K) +ErrorReadingExistingDest=بار ھۆججەتنى ئوقۇشتا خاتالىق كۆرۈلدى: +FileExistsSelectAction=مەشغۇلات تاللاش +FileExists2=ھۆججەت ئاللىبۇرۇن بار. +FileExistsOverwriteExisting=بار ھۆججەتنى قاپلىۋېتىش(&O) +FileExistsKeepExisting=بار ھۆججەتنى ساقلاپ قىلىش(&K) +FileExistsOverwriteOrKeepAll=كېيىنكى توقۇنۇشقا بۇنى قىلىش(&D) +ExistingFileNewerSelectAction=مەشغۇلات تاللاش +ExistingFileNewer2=بار ھۆججەت قاچىلىماقچى بولغان ھۆججەتتىن يېڭى. +ExistingFileNewerOverwriteExisting=بار ھۆججەتنى قاپلىۋېتىش(&O) +ExistingFileNewerKeepExisting=بار ھۆججەتنى ساقلاپ قىلىش(&K) (تەۋسىيە) +ExistingFileNewerOverwriteOrKeepAll=كېيىنكى توقۇنۇشقا بۇنى قىلىش(&D) +ErrorChangingAttr=بار ھۆججەتنىڭ خاسلىقىنى ئۆزگەرتىشتە خاتالىق كۆرۈلدى: +ErrorCreatingTemp=نىشان مۇندەرىجىگە ھۆججەت قۇرۇشتا خاتالىق كۆرۈلدى: +ErrorReadingSource=مەنبە ھۆججەتنى ئوقۇشتا خاتالىق كۆرۈلدى: +ErrorCopying=ھۆججەت كۆچۈرۈشتە خاتالىق كۆرۈلدى: +ErrorReplacingExistingFile=بار ھۆججەتنى ئالماشتۇرۇشتا خاتالىق كۆرۈلدى: +ErrorRestartReplace=قايتا ئالماشتۇرالمىدى: +ErrorRenamingTemp=نىشان مۇندەرىجىدىكى ھۆججەتنىڭ نامىنى ئۆزگەرتىشتە خاتالىق كۆرۈلدى: +ErrorRegisterServer=DLL/OCX نى تىزىملىتالمىدى: %1 +ErrorRegSvr32Failed=RegSvr32 مەغلۇپ بولدى، چېكىنىش كودى %1 +ErrorRegisterTypeLib=تىپ ئامبىرىنى تىزىملىتالمىدى: %1 -; ‫*** ‫Post-installation ‫errors -ErrorOpeningReadme=‫‮‫‫‮‫چۈشەندۈرۈش ‫قوللانمىسىنى ‫ئېچىشتا ‫خاتالىق ‫كۆرۈلدى. -ErrorRestartingComputer=‫‮‫‫‮‫قاچىلاش ‫يېتەكچىسى ‫كومپيۇتېرنى ‫قايتا ‫قوزغىتالمىدى. ‫قول ‫ئارقىلىق ‫قايتا ‫قوزغىتىڭ. +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2، %3) +UninstallDisplayNameMark32Bit=32 بىت +UninstallDisplayNameMark64Bit=64 بىت +UninstallDisplayNameMarkAllUsers=بارلىق ئىشلەتكۈچى +UninstallDisplayNameMarkCurrentUser=نۆۋەتتىكى ئىشلەتكۈچى -; ‫*** ‫Uninstaller ‫messages -UninstallNotFound=‫‮‫‫‮‫"%1" ‫ھۆججىتى ‫يوق. ‫ئۆچۈرەلمەيدۇ. -UninstallOpenError=‫‮‫‫‮‫"%1" ‫ھۆججىتىنى ‫ئاچالمىدى. ‫ئۆچۈرەلمەيدۇ. -UninstallUnsupportedVer=‫‮‫‫‮‫بۇ ‫قاچىلاش ‫يېتەكچىسى"%1" ‫شەكىلدىكى ‫ئۆچۈرۈش ‫خاتىرىسىنى ‫تونۇيالمىدى.ئۆچۈرۈش ‫مەغلۇپ ‫بولدى. -UninstallUnknownEntry=‫‮‫‫‮‫ئۆچۈرۈش ‫خاتىرىسىدە ‫نامەلۇم ‫تۈر ‫(%1) ‫بايقالدى -ConfirmUninstall=‫‮‫‫‮‫سىز ‫راستتىنلا ‫%1 ‫ۋە ‫بارلىق ‫قىستۇرمىلارنى ‫پاكىز ‫ئۆچۈرۈۋەتمەكچىمۇ؟ -UninstallOnlyOnWin64=‫‮‫‫‮‫بۇ ‫قاچىلانما ‫پەقەت ‫64بىتلىق ‫Windows ‫مۇھىتىدا ‫ئۆچۈرۈلىدۇ. -OnlyAdminCanUninstall=‫‮‫‫‮‫بۇ ‫دېتالنى ‫پەقەت ‫باشقۇرغۇچىلىق ‫سالاھىيتىدىكى ‫ئىشلەتكۈچىلەرلا ‫ئۆچۈرەلەيدۇ. -UninstallStatusLabel=‫‮‫‫‮‫سەل ‫ساقلاڭ، ‫%1نى ‫ئۆچۈرۈۋاتىدۇ. -UninstalledAll=‫‮‫‫‮‫سىزنىڭ ‫كومپيۇتېرىڭىزدىن ‫%1نى ‫ئۆچۈرۈش ‫مۇۋەپپەقىيەتلىك ‫بولدى. -UninstalledMost=‫‮‫‫‮‫%1 ‫ئۆچۈرۈش ‫تاماملاندى.%n%nمەلۇم ‫تۈرلەرنى ‫ئۆچۈرۈش ‫جەريانىدا ‫ئۆچۈرەلمىدى. ‫بۇلارنى ‫قولدا ‫ئۆچۈرۈۋەتسىڭىز ‫بولىدۇ. -UninstalledAndNeedsRestart=‫‮‫‫‮‫%1نى ‫ئۆچۈرۈشنى ‫تاماملاش ‫ئۈچۈن، ‫كومپيۇتېرنى ‫قايتا ‫قوزغىتىشىڭىز ‫كېرەك. ‫%n%nھازىرلا ‫قايتا ‫قوزغىتامسىز؟ -UninstallDataCorrupted=‫‮‫‫‮‫"%1" ‫ھۆججىتى ‫بۇزۇلغان. ‫ئۆچۈرەلمەيدۇ +; *** Post-installation errors +ErrorOpeningReadme=چۈشەندۈرۈش ھۆججىتىنى ئېچىشتا خاتالىق كۆرۈلدى. +ErrorRestartingComputer=قاچىلاش پىروگراممىسى كومپيۇتېرنى قايتا قوزغىتالمىدى. بۇنى ئۆزىڭىز قىلىڭ. -; ‫*** ‫Uninstallation ‫phase ‫messages -ConfirmDeleteSharedFileTitle=‫‮‫‫‮‫ئورتاقلاشقان ‫ھۆججەتنى ‫ئۆچۈرەمسىز؟ -ConfirmDeleteSharedFile2=‫‮‫‫‮‫سىستېما ‫تۆۋەندىكى ‫ئورتاق ‫ھۆججەتنى ‫ئىشلەتمەيدۇ. ‫بۇ ‫ئورتاق ‫ھۆججەتنى ‫ئۆچۈرەمسىز؟%n%nئەگەر ‫سىستېما ‫بۇ ‫ھۆججەتنى ‫ئىشلەتسە، ‫ئۆچۈرۈۋەتكەندىن ‫كېيىن ‫سىستېما ‫نورمال ‫ئىشلىمەسلىكى ‫مۇمكىن. ‫مۇقۇملاشتۇرالمىسىڭىز ‫"ياق" ‫نى ‫تاللاڭ. ‫بۇ ‫ھۆججەت ‫قېلىپ ‫قالسا ‫سىستېمىغا ‫ھېچ ‫قانداق ‫ئەكس ‫تەسىرى ‫يوق. -SharedFileNameLabel=‫‮‫‫‮‫ھۆججەت ‫نامى: -SharedFileLocationLabel=‫‮‫‫‮‫ئورنى: -WizardUninstalling=‫‮‫‫‮‫ئۆچۈرۈش ‫ھالىتى -StatusUninstalling=‫‮‫‫‮‫%1نى ‫ئۆچۈرۈۋاتىدۇ… +; *** Uninstaller messages +UninstallNotFound=«%1» ھۆججىتى يوق. چىقىرىۋېتەلمەيدۇ. +UninstallOpenError=«%1» ھۆججىتىنى ئاچالمىدى. چىقىرىۋېتەلمەيدۇ +UninstallUnsupportedVer=چىقىرىۋېتىش خاتىرە ھۆججىتى «%1» نىڭ فورماتىنى بۇ نەشرىدىكى چىقىرىۋەتكۈچ تونۇيالمىدى. چىقىرىۋېتەلمەيدۇ +UninstallUnknownEntry=چىقىرىۋېتىش خاتىرىسىدە نامەلۇم مەزمۇنغا (%1) يولۇقتى +ConfirmUninstall=%1 ۋە ئۇنىڭ بارلىق بىرىكمىلىرىنى پۈتۈنلەي چىقىرىۋېتەمسىز؟ +UninstallOnlyOnWin64=بۇ قاچىلاشنى پەقەت 64 بىتلىق Windows دا چىقىرىۋەتكىلى بولىدۇ. +OnlyAdminCanUninstall=بۇ قاچىلاشنى پەقەت باشقۇرغۇچىلىق ھوقۇقى بار ئىشلەتكۈچى چىقىرىۋېتەلەيدۇ. +UninstallStatusLabel=كومپيۇتېرىڭىزدىن %1 چىقىرىلىۋاتىدۇ، سەل ساقلاڭ. +UninstalledAll=%1 نى كومپيۇتېرىڭىزدىن ئوڭۇشلۇق چىقىرىۋەتتى. +UninstalledMost=%1 چىقىرىۋەتتى.%n%nبەزى ئېلېمېنتلارنى چىقىرىۋېتەلمىدى. بۇلارنى ئۆزىڭىز چىقىرىۋەتسىڭىز بولىدۇ. +UninstalledAndNeedsRestart=%1 نى چىقىرىۋېتىش ئۈچۈن، كومپيۇتېرىڭىزنى قايتا قوزغىتىش كېرەك.%n%nھازىرلا قايتا قوزغىتامسىز؟ +UninstallDataCorrupted=«%1» ھۆججىتى بۇزۇلغان. چىقىرىۋېتەلمەيدۇ -; ‫*** ‫Shutdown ‫block ‫reasons -ShutdownBlockReasonInstallingApp=‫‮‫‫‮‫%1نى ‫قاچىلاۋاتىدۇ. -ShutdownBlockReasonUninstallingApp=‫‮‫‫‮‫%1نى ‫ئۆچۈرۈۋاتىدۇ. +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=ئورتاقلاشقان ھۆججەتنى چىقىرىۋېتەمسىز؟ +ConfirmDeleteSharedFile2=سىستېما تۆۋەندىكى ئورتاقلاشقان ھۆججەتنى ھېچقانداق پىروگراممىنىڭ ئىشلەتمەيدىغانلىقىنى كۆرسەتتى. بۇ ئورتاقلاشقان ھۆججەتنى چىقىرىۋېتەمسىز؟%n%nئەگەر بۇ ھۆججەتنى چىقىرىۋەتكەندىن كېيىن بىرەر پىروگرامما ئىشلەتسە، شۇ پىروگراممىدا نورمالسىزلىق چىقىشى مۇمكىن. ئەگەر ئىككىلەنسىڭىز، «ياق» نى تاللاڭ. ھۆججەت سىستېمىڭىزدا قالسا ھېچقانداق زىيىنى يوق. +SharedFileNameLabel=ھۆججەت نامى: +SharedFileLocationLabel=ئورنى: +WizardUninstalling=چىقىرىۋېتىش ھالىتى +StatusUninstalling=%1 نى چىقىرىۋاتىدۇ... -; ‫The ‫custom ‫messages ‫below ‫aren't ‫used ‫by ‫Setup ‫itself, ‫but ‫if ‫you ‫make -; ‫use ‫of ‫them ‫in ‫your ‫scripts, ‫you'll ‫want ‫to ‫translate ‫them. +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=%1 نى قاچىلاۋاتىدۇ. +ShutdownBlockReasonUninstallingApp=%1 نى چىقىرىۋاتىدۇ. + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. [CustomMessages] -NameAndVersion=‫‮‫‫‮‫%1نىڭ ‫%2 نەشىرى -AdditionalIcons=‫‮‫‫‮‫قوشۇمچە ‫قىسقا ‫يولى: +NameAndVersion=%1 نەشرى %2 +AdditionalIcons=قوشۇمچە قىسقا يولى: CreateDesktopIcon=ئۈستەليۈزىگە قىسقا يول قۇرۇش(&D) -CreateQuickLaunchIcon=تېز قوزغىتىش بالدىقىغا قىسقا يول قۇرۇش(&Q) -ProgramOnTheWeb=‫‮‫‫‮‫%1تور ‫بېكەت -UninstallProgram=‫‮‫‫‮‫%1نى ‫ئۆچۈرۈش -LaunchProgram=‫‮‫‫‮‫%1نى ‫ئىجرا ‫قىلىش -AssocFileExtension=‫‮‫‫‮‫%1 ‫بىلەن ‫%2 ‫بولغان ‫ھۆججەت ‫نامىنى ‫باغلاش (&A) -AssocingFileExtension=‫‮‫‫‮‫ھازىر%1 ‫بىلەن ‫%2 ‫بولغان ‫ھۆججەت ‫نامى ‫باغلىنىۋاتىدۇ...… -AutoStartProgramGroupDescription=‫‮‫‫‮‫قوزغىتىش: -AutoStartProgram=‫‮‫‫‮‫%1 ‫نى ‫ئاپتوماتىك ‫قوزغىتىش -AddonHostProgramNotFound=‫‮‫‫‮‫سىز ‫تاللىغان ‫ھۆججەت ‫قىسقۇچتا ‫%1نى ‫تاپالمىدى.%n%nشۇنداقتىمۇ ‫داۋاملاشتۇرامسىز؟ \ No newline at end of file +CreateQuickLaunchIcon=تېز قوزغىتىشقا قىسقا يول قۇرۇش(&Q) +ProgramOnTheWeb=توردىكى %1 +UninstallProgram=%1 نى چىقىرىۋېتىش +LaunchProgram=%1 نى قوزغىتىش +AssocFileExtension=%1 نى %2 ھۆججەت كېڭەيتمە نامى بىلەن باغلاش(&A) +AssocingFileExtension=%1 نى %2 ھۆججەت كېڭەيتمە نامى بىلەن باغلاۋاتىدۇ... +AutoStartProgramGroupDescription=قوزغىتىش: +AutoStartProgram=%1 نى ئاپتوماتىك قوزغىتىش +AddonHostProgramNotFound=سىز تاللىغان قىسقۇچتا %1 تېپىلمىدى.%n%nشۇنداقتىمۇ داۋاملاشتۇرامسىز؟ diff --git a/installer/innosetup/setup.iss b/installer/innosetup/setup.iss index 449cf2014..fa358ee7b 100644 --- a/installer/innosetup/setup.iss +++ b/installer/innosetup/setup.iss @@ -7,6 +7,7 @@ #define BinDir "bin\Release\net472" #define ReleaseDir "..\..\src\Greenshot\bin\Release\net472" #define PluginDir "..\..\src\Greenshot\bin\Release\net472\Plugins" +#define CertumThumbprint GetEnv('CertumThumbprint') ; Include the scripts to install .NET Framework ; See https://www.codeproject.com/KB/install/dotnetfx_innosetup_instal.aspx @@ -26,6 +27,7 @@ Source: {#ReleaseDir}\Greenshot.Editor.dll; DestDir: {app}; Components: greensho Source: {#ReleaseDir}\Greenshot.exe.config; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: {#ReleaseDir}\log4net.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: {#ReleaseDir}\Dapplo.*.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion +Source: {#ReleaseDir}\System.*.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: {#ReleaseDir}\Svg.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: {#ReleaseDir}\Fizzler.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion Source: {#ReleaseDir}\HtmlAgilityPack.dll; DestDir: {app}; Components: greenshot; Flags: overwritereadonly ignoreversion replacesameversion @@ -81,33 +83,34 @@ Source: {#LanguagesDir}\*zh-CN*; Excludes: "*installer*,*website*"; DestDir: {ap Source: {#LanguagesDir}\*zh-TW*; Excludes: "*installer*,*website*"; DestDir: {app}\Languages; Components: languages\zhTW; Flags: overwritereadonly ignoreversion replacesameversion; ;Office Plugin -Source: {#PluginDir}\Greenshot.Plugin.Office\*.dll; DestDir: {app}\Plugins\Office; Components: plugins\office; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Office\Greenshot.Plugin.Office.dll; DestDir: {app}\Plugins\Office; Components: plugins\office; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; ;JIRA Plugin -Source: {#PluginDir}\Greenshot.Plugin.Jira\*.dll; DestDir: {app}\Plugins\Jira; Components: plugins\jira; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Jira\*Jira*.dll; DestDir: {app}\Plugins\Jira; Components: plugins\jira; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Jira\Languages\language_jira*.xml; DestDir: {app}\Languages\Plugins\Jira; Components: plugins\jira; Flags: overwritereadonly ignoreversion replacesameversion; ;Imgur Plugin -Source: {#PluginDir}\Greenshot.Plugin.Imgur\*.dll; DestDir: {app}\Plugins\Imgur; Components: plugins\imgur; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Imgur\Greenshot.Plugin.Imgur.dll; DestDir: {app}\Plugins\Imgur; Components: plugins\imgur; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Imgur\Languages\language_imgur*.xml; DestDir: {app}\Languages\Plugins\Imgur; Components: plugins\imgur; Flags: overwritereadonly ignoreversion replacesameversion; ;Box Plugin -Source: {#PluginDir}\Greenshot.Plugin.Box\*.dll; DestDir: {app}\Plugins\Box; Components: plugins\box; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Box\Greenshot.Plugin.Box.dll; DestDir: {app}\Plugins\Box; Components: plugins\box; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Box\Languages\language_box*.xml; DestDir: {app}\Languages\Plugins\Box; Components: plugins\box; Flags: overwritereadonly ignoreversion replacesameversion; ;DropBox Plugin -Source: {#PluginDir}\Greenshot.Plugin.DropBox\*.dll; DestDir: {app}\Plugins\DropBox; Components: plugins\dropbox; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.DropBox\Greenshot.Plugin.DropBox.dll; DestDir: {app}\Plugins\DropBox; Components: plugins\dropbox; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.DropBox\Languages\language_dropbox*.xml; DestDir: {app}\Languages\Plugins\DropBox; Components: plugins\dropbox; Flags: overwritereadonly ignoreversion replacesameversion; ;Flickr Plugin -Source: {#PluginDir}\Greenshot.Plugin.Flickr\*.dll; DestDir: {app}\Plugins\Flickr; Components: plugins\flickr; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Flickr\Greenshot.Plugin.Flickr.dll; DestDir: {app}\Plugins\Flickr; Components: plugins\flickr; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Flickr\Languages\language_flickr*.xml; DestDir: {app}\Languages\Plugins\Flickr; Components: plugins\flickr; Flags: overwritereadonly ignoreversion replacesameversion; ;Photobucket Plugin -Source: {#PluginDir}\Greenshot.Plugin.Photobucket\*.dll; DestDir: {app}\Plugins\Photobucket; Components: plugins\photobucket; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Photobucket\Greenshot.Plugin.Photobucket.dll; DestDir: {app}\Plugins\Photobucket; Components: plugins\photobucket; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Photobucket\Languages\language_photo*.xml; DestDir: {app}\Languages\Plugins\Photobucket; Components: plugins\photobucket; Flags: overwritereadonly ignoreversion replacesameversion; ;Confluence Plugin -Source: {#PluginDir}\Greenshot.Plugin.Confluence\*.dll; DestDir: {app}\Plugins\Confluence; Components: plugins\confluence; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Confluence\Greenshot.Plugin.Confluence.dll; DestDir: {app}\Plugins\Confluence; Components: plugins\confluence; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.Confluence\Languages\language_confluence*.xml; DestDir: {app}\Languages\Plugins\Confluence; Components: plugins\confluence; Flags: overwritereadonly ignoreversion replacesameversion; ;ExternalCommand Plugin -Source: {#PluginDir}\Greenshot.Plugin.ExternalCommand\*.dll; DestDir: {app}\Plugins\ExternalCommand; Components: plugins\externalcommand; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.ExternalCommand\Greenshot.Plugin.ExternalCommand.dll; DestDir: {app}\Plugins\ExternalCommand; Components: plugins\externalcommand; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; Source: {#BaseDir}\Greenshot.Plugin.ExternalCommand\Languages\language_externalcommand*.xml; DestDir: {app}\Languages\Plugins\ExternalCommand; Components: plugins\externalcommand; Flags: overwritereadonly ignoreversion replacesameversion; ;Win 10 Plugin -Source: {#PluginDir}\Greenshot.Plugin.Win10\*.dll; DestDir: {app}\Plugins\Win10; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Win10\Greenshot.Plugin.Win10.dll; DestDir: {app}\Plugins\Win10; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; +Source: {#PluginDir}\Greenshot.Plugin.Win10\Microsoft.Toolkit.Uwp.Notifications.dll; DestDir: {app}\Plugins\Win10; Components: plugins\win10; Flags: overwritereadonly recursesubdirs ignoreversion replacesameversion; [Setup] ; changes associations is used when the installer installs new extensions, it clears the explorer icon cache @@ -124,21 +127,27 @@ AppVersion={#Version} ArchitecturesInstallIn64BitMode=x64 Compression=lzma2/ultra64 SolidCompression=yes -DefaultDirName={code:DefDirRoot}\{#ExeName} +DefaultDirName={autopf}\{#ExeName} DefaultGroupName={#ExeName} InfoBeforeFile=..\additional_files\readme.txt LicenseFile=..\additional_files\license.txt LanguageDetectionMethod=uilanguage MinVersion=6.1sp1 -OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE OutputDir=..\ +; user may choose between all-users vs. current-user installation in a dialog or by using the /ALLUSERS flag (on the command line) +; in registry section, HKA will take care of the appropriate root key (HKLM vs. HKCU), see https://jrsoftware.org/ishelp/index.php?topic=admininstallmode +PrivilegesRequiredOverridesAllowed=dialog +; admin privileges not required, unless user chooses all-users installation +; the installer will ask for elevation if needed PrivilegesRequired=lowest SetupIconFile=..\..\src\Greenshot\icons\applicationIcon\icon.ico -; Create a SHA1 signature -; SignTool=SignTool sign /debug /fd sha1 /tr https://time.certum.pl /td sha1 $f -; Append a SHA256 to the previous SHA1 signature (this is what as does) -; SignTool=SignTool sign /debug /as /fd sha256 /tr https://time.certum.pl /td sha256 $f -; SignedUninstaller=yes +#if CertumThumbprint != "" + OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE + SignTool=SignTool sign /sha1 "{#CertumThumbprint}" /tr http://time.certum.pl /td sha256 /fd sha256 /v $f + SignedUninstaller=yes +#else + OutputBaseFilename={#ExeName}-INSTALLER-{#Version}-UNSTABLE-UNSIGNED +#endif UninstallDisplayIcon={app}\{#ExeName}.exe Uninstallable=true VersionInfoCompany={#ExeName} @@ -150,6 +159,7 @@ VersionInfoVersion={#Version} WizardImageFile=installer-large.bmp ; Reference a bitmap, max size 55x58 WizardSmallImageFile=installer-small.bmp + [Registry] ; Delete all startup entries, so we don't have leftover values Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; @@ -168,22 +178,16 @@ Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: none; ValueName: {#E Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: none; ValueName: {#ExeName}; Flags: deletevalue noerror; ; Create the startup entries if requested to do so -; HKEY_LOCAL_USER - for current user only -Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: IsRegularUser -; HKEY_LOCAL_MACHINE - for all users when admin -Root: HKLM; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Tasks: startup; Check: not IsRegularUser +Root: HKA; Subkey: Software\Microsoft\Windows\CurrentVersion\Run; ValueType: string; ValueName: {#ExeName}; ValueData: """{app}\{#ExeName}.exe"""; Flags: uninsdeletevalue noerror; Tasks: startup ; Register our own filetype for all users -; HKEY_LOCAL_USER - for current user only -Root: HKCU; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser -Root: HKCU; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser -Root: HKCU; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser -Root: HKCU; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: users-modify; Flags: uninsdeletevalue noerror; Check: IsRegularUser -; HKEY_LOCAL_MACHINE - for all users when admin -Root: HKLM; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser -Root: HKLM; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Permissions: admins-modify; Flags: uninsdeletevalue noerror; Check: not IsRegularUser +Root: HKA; Subkey: Software\Classes\.greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot"; Flags: uninsdeletevalue noerror +Root: HKA; Subkey: Software\Classes\Greenshot; ValueType: string; ValueName: ""; ValueData: "Greenshot File"; Flags: uninsdeletevalue noerror +Root: HKA; Subkey: Software\Classes\Greenshot\DefaultIcon; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE,0"""; Flags: uninsdeletevalue noerror +Root: HKA; Subkey: Software\Classes\Greenshot\shell\open\command; ValueType: string; ValueName: ""; ValueData: """{app}\Greenshot.EXE"" --openfile ""%1"""; Flags: uninsdeletevalue noerror + +; Disable the default PRTSCR Snipping Tool in Windows 11 +Root: HKCU; Subkey: Control Panel\Keyboard; ValueType: dword; ValueName: "PrintScreenKeyForSnippingEnabled"; ValueData: "0"; Flags: uninsdeletevalue; Check: ShouldDisableSnippingTool [Icons] Name: {group}\{#ExeName}; Filename: {app}\{#ExeName}.exe; WorkingDir: {app}; AppUserModelID: "{#ExeName}" @@ -267,6 +271,7 @@ en.win10=Windows 10 plug-in en.UninstallIconDescription=Uninstall en.ShowLicense=Show license en.ShowReadme=Show Readme +en.disablewin11snippingtool=Disable Win11 default PrtScr snipping tool de.confluence=Confluence Plug-in de.default=Standard installation @@ -279,6 +284,7 @@ de.optimize=Optimierung der Leistung, kann etwas dauern. de.startgreenshot={#ExeName} starten de.startup={#ExeName} starten wenn Windows hochfährt de.win10=Windows 10 Plug-in +de.disablewin11snippingtool=Deaktiviere das Standard Windows 11 Snipping Tool auf "Druck" es.confluence=Extensión para Confluence es.default=${default} @@ -480,6 +486,7 @@ Name: "compact"; Description: "{code:CompactInstall}" Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom [Components] +Name: "disablesnippingtool"; Description: {cm:disablewin11snippingtool}; Flags: disablenouninstallwarning; Types: default full custom; Check: IsWindows11OrNewer() Name: "greenshot"; Description: "Greenshot"; Types: default full compact custom; Flags: fixed ;Name: "plugins\networkimport"; Description: "Network Import Plugin"; Types: full Name: "plugins\box"; Description: {cm:box}; Types: full custom; Flags: disablenouninstallwarning @@ -529,23 +536,8 @@ Name: "languages\ukUA"; Description: {cm:ukUA}; Types: full custom; Flags: disab Name: "languages\viVN"; Description: {cm:viVN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('e') Name: "languages\zhCN"; Description: {cm:zhCN}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('a') Name: "languages\zhTW"; Description: {cm:zhTW}; Types: full custom; Flags: disablenouninstallwarning; Check: hasLanguageGroup('9') + [Code] -// Do we have a regular user trying to install this? -function IsRegularUser(): Boolean; -begin - Result := not (IsAdmin or IsAdminInstallMode); -end; - -// The following code is used to select the installation path, this is localappdata if non poweruser -function DefDirRoot(Param: String): String; -begin - if IsRegularUser then - Result := ExpandConstant('{localappdata}') - else - Result := ExpandConstant('{pf}') -end; - - function FullInstall(Param : String) : String; begin result := SetupMessage(msgFullInstallation); @@ -743,6 +735,19 @@ begin Result := IsWindowsVersionOrNewer(10, 0); end; +function IsWindows11OrNewer: Boolean; +var + WindowsVersion: TWindowsVersion; +begin + GetWindowsVersionEx(WindowsVersion); + Result := (WindowsVersion.Major >= 10) and (WindowsVersion.Build >= 22000); +end; + +function ShouldDisableSnippingTool: Boolean; +begin + Result := IsComponentSelected('disablesnippingtool'); +end; + [Run] Filename: "{app}\{#ExeName}.exe"; Description: "{cm:startgreenshot}"; Parameters: "{code:GetParamsForGS}"; WorkingDir: "{app}"; Flags: nowait postinstall runasoriginaluser Filename: "https://getgreenshot.org/thank-you/?language={language}&version={#Version}"; Flags: shellexec runasoriginaluser diff --git a/nuget.config b/nuget.config new file mode 100644 index 000000000..554c2f634 --- /dev/null +++ b/nuget.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/.editorconfig b/src/.editorconfig index f399b08bb..0141618f9 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -47,11 +47,6 @@ dotnet_style_explicit_tuple_names = true:suggestion # CSharp code style settings: [*.cs] -# Prefer "var" everywhere -csharp_style_var_for_built_in_types = true:suggestion -csharp_style_var_when_type_is_apparent = true:suggestion -csharp_style_var_elsewhere = true:suggestion - # Prefer method-like constructs to have a block body csharp_style_expression_bodied_methods = false:none csharp_style_expression_bodied_constructors = false:none diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b6533ddd7..131878749 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,13 +1,13 @@  - Copyright © Greenshot 2004-2021 + Copyright © Greenshot 2004-2022 Greenshot https://getgreenshot.org/favicon.ico https://github.com/greenshot/greenshot git https://github.com/greenshot/greenshot GPL-3.0-only - 9 + latest true true win10-x64;win10-x86;win-x64;win-x86 @@ -46,7 +46,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index f2ce406a1..caa6a3db3 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,13 +1,65 @@ + + + + + + + + + + (); + foreach (var line in InputLines) + { + string text = line.ItemSpec; + foreach (var token in Tokens) + { + string tokenName = token.ItemSpec; + // Skip if tokenName is null or empty + if (string.IsNullOrEmpty(tokenName)) + continue; + + string replacementValue = token.GetMetadata("ReplacementValue"); + if (!string.IsNullOrEmpty(replacementValue)) + { + string placeholder = "$"+ "{"+tokenName+"}"; // Token-Format wie $(Box13_ClientId) + text = text.Replace(placeholder, replacementValue); + } + } + output.Add(new Microsoft.Build.Utilities.TaskItem(text)); + } + OutputLines = output.ToArray(); + ]]> + + + - $(PkgMSBuildTasks)\tools\ + $(NuGetPackageRoot)msbuildtasks/1.5.0.235/tools/ - - + + - - + + + + + + + + + + + + - \ No newline at end of file + + + + + diff --git a/src/Greenshot.Base/Controls/GreenshotForm.cs b/src/Greenshot.Base/Controls/GreenshotForm.cs index eff79e975..85bc6bd4d 100644 --- a/src/Greenshot.Base/Controls/GreenshotForm.cs +++ b/src/Greenshot.Base/Controls/GreenshotForm.cs @@ -102,6 +102,20 @@ namespace Greenshot.Base.Controls /// protected bool ToFront { get; set; } + protected GreenshotForm() + { + DpiChanged += (sender, dpiChangedEventArgs) => DpiChangedHandler(dpiChangedEventArgs.DeviceDpiOld, dpiChangedEventArgs.DeviceDpiNew); + } + + /// + /// This is the basic DpiChangedHandler responsible for all the DPI relative changes + /// + /// + /// + protected virtual void DpiChangedHandler(int oldDpi, int newDpi) + { + } + #if DEBUG /// /// Code to initialize the language etc during design time @@ -350,7 +364,7 @@ namespace Greenshot.Base.Controls { if (!Language.TryGetString(languageKey, out langString)) { - LOG.WarnFormat("Unknown language key '{0}' configured for control '{1}', this might be okay.", languageKey, applyTo.Name); + LOG.DebugFormat("Unknown language key '{0}' configured for control '{1}', this might be okay.", languageKey, applyTo.Name); return; } @@ -382,10 +396,10 @@ namespace Greenshot.Base.Controls protected void ApplyLanguage(Control applyTo) { - if (!(applyTo is IGreenshotLanguageBindable languageBindable)) + if (applyTo is not IGreenshotLanguageBindable languageBindable) { // check if it's a menu! - if (!(applyTo is ToolStrip toolStrip)) + if (applyTo is not ToolStrip toolStrip) { return; } @@ -402,20 +416,14 @@ namespace Greenshot.Base.Controls ApplyLanguage(applyTo, languageBindable.LanguageKey); // Repopulate the combox boxes - if (applyTo is IGreenshotConfigBindable configBindable && applyTo is GreenshotComboBox comboxBox) - { - if (!string.IsNullOrEmpty(configBindable.SectionName) && !string.IsNullOrEmpty(configBindable.PropertyName)) - { - IniSection section = IniConfig.GetIniSection(configBindable.SectionName); - if (section != null) - { - // Only update the language, so get the actual value and than repopulate - Enum currentValue = comboxBox.GetSelectedEnum(); - comboxBox.Populate(section.Values[configBindable.PropertyName].ValueType); - comboxBox.SetValue(currentValue); - } - } - } + if (applyTo is not (IGreenshotConfigBindable configBindable and GreenshotComboBox comboxBox)) return; + if (string.IsNullOrEmpty(configBindable.SectionName) || string.IsNullOrEmpty(configBindable.PropertyName)) return; + IniSection section = IniConfig.GetIniSection(configBindable.SectionName); + if (section == null) return; + // Only update the language, so get the actual value and than repopulate + Enum currentValue = comboxBox.GetSelectedEnum(); + comboxBox.Populate(section.Values[configBindable.PropertyName].ValueType); + comboxBox.SetValue(currentValue); } /// @@ -458,10 +466,9 @@ namespace Greenshot.Base.Controls continue; } - if (!(controlObject is Control applyToControl)) + if (controlObject is not Control applyToControl) { - ToolStripItem applyToItem = controlObject as ToolStripItem; - if (applyToItem == null) + if (controlObject is not ToolStripItem applyToItem) { LOG.DebugFormat("No Control or ToolStripItem: {0}", field.Name); continue; @@ -530,7 +537,7 @@ namespace Greenshot.Base.Controls /// /// Fill all GreenshotControls with the values from the configuration /// - protected void FillFields() + private void FillFields() { foreach (FieldInfo field in GetCachedFields(GetType())) { diff --git a/src/Greenshot.Base/Controls/SaveImageFileDialog.cs b/src/Greenshot.Base/Controls/SaveImageFileDialog.cs index 3c9b2780e..091152d64 100644 --- a/src/Greenshot.Base/Controls/SaveImageFileDialog.cs +++ b/src/Greenshot.Base/Controls/SaveImageFileDialog.cs @@ -120,6 +120,7 @@ namespace Greenshot.Base.Controls private void PrepareFilterOptions() { + // TODO: Change to the FileFormatHandlerRegistry to look for all the supported extensions OutputFormat[] supportedImageFormats = (OutputFormat[]) Enum.GetValues(typeof(OutputFormat)); _filterOptions = new FilterOption[supportedImageFormats.Length]; for (int i = 0; i < _filterOptions.Length; i++) @@ -166,7 +167,7 @@ namespace Greenshot.Base.Controls // if the filename contains a valid extension, which is the same like the selected filter item's extension, the filename is okay if (fn.EndsWith(Extension, StringComparison.CurrentCultureIgnoreCase)) return fn; // otherwise we just add the selected filter item's extension - else return fn + "." + Extension; + return fn + "." + Extension; } set { diff --git a/src/Greenshot.Base/Controls/ThumbnailForm.cs b/src/Greenshot.Base/Controls/ThumbnailForm.cs index c8f22f1f1..d5b8c50e8 100644 --- a/src/Greenshot.Base/Controls/ThumbnailForm.cs +++ b/src/Greenshot.Base/Controls/ThumbnailForm.cs @@ -22,12 +22,15 @@ using System; using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.DesktopWindowsManager; +using Dapplo.Windows.DesktopWindowsManager.Structs; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Enums; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; namespace Greenshot.Base.Controls { @@ -70,7 +73,7 @@ namespace Greenshot.Base.Controls { if (_thumbnailHandle == IntPtr.Zero) return; - DWM.DwmUnregisterThumbnail(_thumbnailHandle); + DwmApi.DwmUnregisterThumbnail(_thumbnailHandle); _thumbnailHandle = IntPtr.Zero; } @@ -83,19 +86,19 @@ namespace Greenshot.Base.Controls { UnregisterThumbnail(); - DWM.DwmRegisterThumbnail(Handle, window.Handle, out _thumbnailHandle); + DwmApi.DwmRegisterThumbnail(Handle, window.Handle, out _thumbnailHandle); if (_thumbnailHandle == IntPtr.Zero) return; - var result = DWM.DwmQueryThumbnailSourceSize(_thumbnailHandle, out var sourceSize); + var result = DwmApi.DwmQueryThumbnailSourceSize(_thumbnailHandle, out var sourceSize); if (result.Failed()) { - DWM.DwmUnregisterThumbnail(_thumbnailHandle); + DwmApi.DwmUnregisterThumbnail(_thumbnailHandle); return; } if (sourceSize.IsEmpty) { - DWM.DwmUnregisterThumbnail(_thumbnailHandle); + DwmApi.DwmUnregisterThumbnail(_thumbnailHandle); return; } @@ -110,17 +113,17 @@ namespace Greenshot.Base.Controls Width = thumbnailWidth; Height = thumbnailHeight; // Prepare the displaying of the Thumbnail - var dwmThumbnailProperties = new DWM_THUMBNAIL_PROPERTIES + var dwmThumbnailProperties = new DwmThumbnailProperties() { Opacity = 255, Visible = true, SourceClientAreaOnly = false, - Destination = new RECT(0, 0, thumbnailWidth, thumbnailHeight) + Destination = new NativeRect(0, 0, thumbnailWidth, thumbnailHeight) }; - result = DWM.DwmUpdateThumbnailProperties(_thumbnailHandle, ref dwmThumbnailProperties); + result = DwmApi.DwmUpdateThumbnailProperties(_thumbnailHandle, ref dwmThumbnailProperties); if (result.Failed()) { - DWM.DwmUnregisterThumbnail(_thumbnailHandle); + DwmApi.DwmUnregisterThumbnail(_thumbnailHandle); return; } @@ -137,13 +140,13 @@ namespace Greenshot.Base.Controls // Make sure it's on "top"! if (parentControl != null) { - User32.SetWindowPos(Handle, parentControl.Handle, 0, 0, 0, 0, WindowPos.SWP_NOMOVE | WindowPos.SWP_NOSIZE | WindowPos.SWP_NOACTIVATE); + User32Api.SetWindowPos(Handle, parentControl.Handle, 0, 0, 0, 0, WindowPos.SWP_NOMOVE | WindowPos.SWP_NOSIZE | WindowPos.SWP_NOACTIVATE); } } public void AlignToControl(Control alignTo) { - var screenBounds = WindowCapture.GetScreenBounds(); + var screenBounds = DisplayInfo.ScreenBounds; if (screenBounds.Contains(alignTo.Left, alignTo.Top - Height)) { Location = new Point(alignTo.Left + (alignTo.Width / 2) - (Width / 2), alignTo.Top - Height); diff --git a/src/Greenshot.Base/Core/AbstractDestination.cs b/src/Greenshot.Base/Core/AbstractDestination.cs index 96eaf46bc..c76574bab 100644 --- a/src/Greenshot.Base/Core/AbstractDestination.cs +++ b/src/Greenshot.Base/Core/AbstractDestination.cs @@ -24,15 +24,18 @@ using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Dpi; +using Dapplo.Windows.User32; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; -using Greenshot.Base.UnmanagedHelpers; using log4net; namespace Greenshot.Base.Core { /// - /// Description of AbstractDestination. + /// The AbstractDestination is a default implementation of IDestination /// public abstract class AbstractDestination : IDestination { @@ -41,7 +44,7 @@ namespace Greenshot.Base.Core public virtual int CompareTo(object obj) { - if (!(obj is IDestination other)) + if (obj is not IDestination other) { return 1; } @@ -176,7 +179,7 @@ namespace Greenshot.Base.Core ExportInformation exportInformation = new ExportInformation(Designation, Language.GetString("settings_destination_picker")); var menu = new ContextMenuStrip { - ImageScalingSize = CoreConfig.ScaledIconSize, + ImageScalingSize = CoreConfig.IconSize, Tag = null, TopLevel = true }; @@ -184,10 +187,10 @@ namespace Greenshot.Base.Core menu.Opening += (sender, args) => { // find the DPI settings for the screen where this is going to land - var screenDpi = DpiHelper.GetDpi(menu.Location); - var scaledIconSize = DpiHelper.ScaleWithDpi(CoreConfig.IconSize, screenDpi); + var screenDpi = NativeDpiMethods.GetDpi(menu.Location); + var scaledIconSize = DpiCalculator.ScaleWithDpi(CoreConfig.IconSize, screenDpi); menu.SuspendLayout(); - var fontSize = DpiHelper.ScaleWithDpi(12f, screenDpi); + var fontSize = DpiCalculator.ScaleWithDpi(12f, screenDpi); menu.Font = new Font(FontFamily.GenericSansSerif, fontSize, FontStyle.Regular, GraphicsUnit.Pixel); menu.ImageScalingSize = scaledIconSize; menu.ResumeLayout(); @@ -304,7 +307,7 @@ namespace Greenshot.Base.Core ShowMenuAtCursor(menu); return exportInformation; } - + /// /// This method will show the supplied context menu at the mouse cursor, also makes sure it has focus and it's not visible in the taskbar. /// @@ -312,21 +315,21 @@ namespace Greenshot.Base.Core private static void ShowMenuAtCursor(ContextMenuStrip menu) { // find a suitable location - Point location = Cursor.Position; - Rectangle menuRectangle = new Rectangle(location, menu.Size); + NativePoint location = Cursor.Position; + var menuRectangle = new NativeRect(location, menu.Size); - menuRectangle.Intersect(WindowCapture.GetScreenBounds()); + menuRectangle = menuRectangle.Intersect(DisplayInfo.ScreenBounds); if (menuRectangle.Height < menu.Height) { - location.Offset(-40, -(menuRectangle.Height - menu.Height)); + location = location.Offset(-40, -(menuRectangle.Height - menu.Height)); } else { - location.Offset(-40, -10); + location = location.Offset(-40, -10); } // This prevents the problem that the context menu shows in the task-bar - User32.SetForegroundWindow(SimpleServiceProvider.Current.GetInstance().ContextMenuStrip.Handle); + User32Api.SetForegroundWindow(SimpleServiceProvider.Current.GetInstance().ContextMenuStrip.Handle); menu.Show(location); menu.Focus(); diff --git a/src/Greenshot.Base/Core/AnimationHelpers.cs b/src/Greenshot.Base/Core/AnimationHelpers.cs index 8b58a1c34..fd693683f 100644 --- a/src/Greenshot.Base/Core/AnimationHelpers.cs +++ b/src/Greenshot.Base/Core/AnimationHelpers.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Core { @@ -280,19 +281,19 @@ namespace Greenshot.Base.Core /// /// Implementation of the RectangleAnimator /// - public class RectangleAnimator : AnimatorBase + public class RectangleAnimator : AnimatorBase { - public RectangleAnimator(Rectangle first, Rectangle last, int frames) + public RectangleAnimator(NativeRect first, NativeRect last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } - public RectangleAnimator(Rectangle first, Rectangle last, int frames, EasingType easingType) + public RectangleAnimator(NativeRect first, NativeRect last, int frames, EasingType easingType) : base(first, last, frames, easingType, EasingMode.EaseIn) { } - public RectangleAnimator(Rectangle first, Rectangle last, int frames, EasingType easingType, EasingMode easingMode) + public RectangleAnimator(NativeRect first, NativeRect last, int frames, EasingType easingType, EasingMode easingMode) : base(first, last, frames, easingType, easingMode) { } @@ -300,8 +301,8 @@ namespace Greenshot.Base.Core /// /// Calculate the next frame object /// - /// Rectangle - public override Rectangle Next() + /// NativeRect + public override NativeRect Next() { if (!NextFrame) { @@ -317,7 +318,7 @@ namespace Greenshot.Base.Core double dh = Last.Height - First.Height; int width = First.Width + (int) (easingValue * dw); int height = First.Height + (int) (easingValue * dh); - Current = new Rectangle(x, y, width, height); + Current = new NativeRect(x, y, width, height); return Current; } @@ -326,19 +327,19 @@ namespace Greenshot.Base.Core /// /// Implementation of the PointAnimator /// - public class PointAnimator : AnimatorBase + public class PointAnimator : AnimatorBase { - public PointAnimator(Point first, Point last, int frames) + public PointAnimator(NativePoint first, NativePoint last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } - public PointAnimator(Point first, Point last, int frames, EasingType easingType) + public PointAnimator(NativePoint first, NativePoint last, int frames, EasingType easingType) : base(first, last, frames, easingType, EasingMode.EaseIn) { } - public PointAnimator(Point first, Point last, int frames, EasingType easingType, EasingMode easingMode) + public PointAnimator(NativePoint first, NativePoint last, int frames, EasingType easingType, EasingMode easingMode) : base(first, last, frames, easingType, easingMode) { } @@ -347,7 +348,7 @@ namespace Greenshot.Base.Core /// Calculate the next frame value /// /// Point - public override Point Next() + public override NativePoint Next() { if (NextFrame) { @@ -357,7 +358,7 @@ namespace Greenshot.Base.Core int x = First.X + (int) (easingValue * dx); int y = First.Y + (int) (easingValue * dy); - Current = new Point(x, y); + Current = new NativePoint(x, y); } return Current; @@ -367,19 +368,19 @@ namespace Greenshot.Base.Core /// /// Implementation of the SizeAnimator /// - public class SizeAnimator : AnimatorBase + public class SizeAnimator : AnimatorBase { - public SizeAnimator(Size first, Size last, int frames) + public SizeAnimator(NativeSize first, NativeSize last, int frames) : base(first, last, frames, EasingType.Linear, EasingMode.EaseIn) { } - public SizeAnimator(Size first, Size last, int frames, EasingType easingType) + public SizeAnimator(NativeSize first, NativeSize last, int frames, EasingType easingType) : base(first, last, frames, easingType, EasingMode.EaseIn) { } - public SizeAnimator(Size first, Size last, int frames, EasingType easingType, EasingMode easingMode) + public SizeAnimator(NativeSize first, NativeSize last, int frames, EasingType easingType, EasingMode easingMode) : base(first, last, frames, easingType, easingMode) { } @@ -388,7 +389,7 @@ namespace Greenshot.Base.Core /// Calculate the next frame values /// /// Size - public override Size Next() + public override NativeSize Next() { if (NextFrame) { @@ -397,7 +398,7 @@ namespace Greenshot.Base.Core double dh = Last.Height - First.Height; int width = First.Width + (int) (easingValue * dw); int height = First.Height + (int) (easingValue * dh); - Current = new Size(width, height); + Current = new NativeSize(width, height); } return Current; diff --git a/src/Greenshot.Base/Core/Capture.cs b/src/Greenshot.Base/Core/Capture.cs index 347cd0067..0be688727 100644 --- a/src/Greenshot.Base/Core/Capture.cs +++ b/src/Greenshot.Base/Core/Capture.cs @@ -22,6 +22,9 @@ using System; using System.Drawing; using System.Drawing.Imaging; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.User32; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Ocr; using log4net; @@ -36,18 +39,18 @@ namespace Greenshot.Base.Core { private static readonly ILog Log = LogManager.GetLogger(typeof(Capture)); - private Rectangle _screenBounds; + private NativeRect _screenBounds; /// /// Get/Set the screen bounds /// - public Rectangle ScreenBounds + public NativeRect ScreenBounds { get { - if (_screenBounds == Rectangle.Empty) + if (_screenBounds.IsEmpty) { - _screenBounds = WindowCapture.GetScreenBounds(); + _screenBounds = DisplayInfo.ScreenBounds; } return _screenBounds; @@ -124,23 +127,23 @@ namespace Greenshot.Base.Core /// public bool CursorVisible { get; set; } - private Point _cursorLocation = Point.Empty; + private NativePoint _cursorLocation = NativePoint.Empty; /// /// Get/Set the CursorLocation /// - public Point CursorLocation + public NativePoint CursorLocation { get => _cursorLocation; set => _cursorLocation = value; } - private Point _location = Point.Empty; + private NativePoint _location = NativePoint.Empty; /// /// Get/set the Location /// - public Point Location + public NativePoint Location { get => _location; set => _location = value; @@ -162,7 +165,7 @@ namespace Greenshot.Base.Core /// public Capture() { - _screenBounds = WindowCapture.GetScreenBounds(); + _screenBounds = DisplayInfo.ScreenBounds; _captureDetails = new CaptureDetails(); } @@ -214,8 +217,8 @@ namespace Greenshot.Base.Core /// /// Crops the capture to the specified rectangle (with Bitmap coordinates!) /// - /// Rectangle with bitmap coordinates - public bool Crop(Rectangle cropRectangle) + /// NativeRect with bitmap coordinates + public bool Crop(NativeRect cropRectangle) { Log.Debug("Cropping to: " + cropRectangle); if (!ImageHelper.Crop(ref _image, ref cropRectangle)) @@ -245,7 +248,7 @@ namespace Greenshot.Base.Core /// y coordinates to move the mouse public void MoveMouseLocation(int x, int y) { - _cursorLocation.Offset(x, y); + _cursorLocation = _cursorLocation.Offset(x, y); } // TODO: Enable when the elements are usable again. @@ -261,7 +264,7 @@ namespace Greenshot.Base.Core //private void MoveElements(List listOfElements, int x, int y) { // foreach(ICaptureElement childElement in listOfElements) { - // Rectangle bounds = childElement.Bounds; + // NativeRect bounds = childElement.Bounds; // bounds.Offset(x, y); // childElement.Bounds = bounds; // MoveElements(childElement.Children, x, y); diff --git a/src/Greenshot.Base/Core/CaptureHandler.cs b/src/Greenshot.Base/Core/CaptureHandler.cs index f807666c7..74f58b555 100644 --- a/src/Greenshot.Base/Core/CaptureHandler.cs +++ b/src/Greenshot.Base/Core/CaptureHandler.cs @@ -20,15 +20,16 @@ */ using System.Drawing; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Core { /// /// This is the method signature which is used to capture a rectangle from the screen. /// - /// + /// NativeRect /// Captured Bitmap - public delegate Bitmap CaptureScreenRectangleHandler(Rectangle captureBounds); + public delegate Bitmap CaptureScreenRectangleHandler(NativeRect captureBounds); /// /// This is a hack to experiment with different screen capture routines diff --git a/src/Greenshot.Base/Core/ClipboardHelper.cs b/src/Greenshot.Base/Core/ClipboardHelper.cs index 02a7f03f1..bfe13c121 100644 --- a/src/Greenshot.Base/Core/ClipboardHelper.cs +++ b/src/Greenshot.Base/Core/ClipboardHelper.cs @@ -30,11 +30,17 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; +using Dapplo.Windows.Clipboard; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32.Enums; +using Dapplo.Windows.Gdi32.Structs; +using Dapplo.Windows.User32; using Greenshot.Base.Core.Enums; +using Greenshot.Base.Core.FileFormatHandlers; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Plugin; -using Greenshot.Base.UnmanagedHelpers; using log4net; using HtmlDocument = HtmlAgilityPack.HtmlDocument; @@ -63,7 +69,8 @@ namespace Greenshot.Base.Core //private static readonly string FORMAT_HTML = "HTML Format"; // Template for the HTML Text on the clipboard - // see: https://msdn.microsoft.com/en-us/library/ms649015%28v=vs.85%29.aspx + // see: https://msdn.microsoft.com/en-us/library/ms649015%28v=v + // s.85%29.aspx // or: https://msdn.microsoft.com/en-us/library/Aa767917.aspx private const string HtmlClipboardString = @"Version:0.9 StartHTML:<<<<<<<1 @@ -112,12 +119,12 @@ EndSelection:<<<<<<<4 string owner = null; try { - IntPtr hWnd = User32.GetClipboardOwner(); + IntPtr hWnd = ClipboardNative.CurrentOwner; if (hWnd != IntPtr.Zero) { try { - User32.GetWindowThreadProcessId(hWnd, out var pid); + User32Api.GetWindowThreadProcessId(hWnd, out var pid); using Process me = Process.GetCurrentProcess(); using Process ownerProcess = Process.GetProcessById(pid); // Exclude myself @@ -139,9 +146,7 @@ EndSelection:<<<<<<<4 catch (Exception e) { Log.Warn("Non critical error: Couldn't get clipboard process, trying to use the title.", e); - var title = new StringBuilder(260, 260); - User32.GetWindowText(hWnd, title, title.Capacity); - owner = title.ToString(); + owner = User32Api.GetText(hWnd); } } } @@ -175,7 +180,7 @@ EndSelection:<<<<<<<4 try { - // For BUG-1935 this was changed from looping ourselfs, or letting MS retry... + // For BUG-1935 this was changed from looping ourselves, or letting MS retry... Clipboard.SetDataObject(ido, copy, 15, 200); } catch (Exception clipboardSetException) @@ -279,6 +284,9 @@ EndSelection:<<<<<<<4 { if (dataObject == null) return false; + IList formats = GetFormats(dataObject); + Log.DebugFormat("Found formats: {0}", string.Join(",", formats)); + if (dataObject.GetDataPresent(DataFormats.Bitmap) || dataObject.GetDataPresent(DataFormats.Dib) || dataObject.GetDataPresent(DataFormats.Tiff) @@ -298,14 +306,15 @@ EndSelection:<<<<<<<4 { return true; } - - foreach (var fileData in IterateClipboardContent(dataObject)) + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + var supportedExtensions = fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadDrawableFromStream).ToList(); + foreach (var (stream, filename) in IterateClipboardContent(dataObject)) { try { - using (ImageHelper.FromStream(fileData)) + var extension = Path.GetExtension(filename)?.ToLowerInvariant(); + if (supportedExtensions.Contains(extension)) { - // If we get here, there is an image return true; } } @@ -315,7 +324,7 @@ EndSelection:<<<<<<<4 } finally { - fileData?.Dispose(); + stream?.Dispose(); } } @@ -327,7 +336,8 @@ EndSelection:<<<<<<<4 var imageStream = clipboardContent as MemoryStream; if (IsValidStream(imageStream)) { - using (ImageHelper.FromStream(imageStream)) + // TODO: How to check if we support "just a stream"? + using (ImageIO.FromStream(imageStream)) { // If we get here, there is an image return true; @@ -373,9 +383,10 @@ EndSelection:<<<<<<<4 /// Iterate the clipboard content /// /// IDataObject - /// IEnumerable{MemoryStream} - private static IEnumerable IterateClipboardContent(IDataObject dataObject) + /// IEnumerable{(MemoryStream,string)} + private static IEnumerable<(MemoryStream stream,string filename)> IterateClipboardContent(IDataObject dataObject) { + if (dataObject == null) yield break; var fileDescriptors = AvailableFileDescriptors(dataObject); if (fileDescriptors == null) yield break; @@ -413,8 +424,8 @@ EndSelection:<<<<<<<4 /// /// IEnumerable{FileDescriptor} /// IDataObject - /// IEnumerable{MemoryStream} - private static IEnumerable IterateFileDescriptors(IEnumerable fileDescriptors, IDataObject dataObject) + /// IEnumerable{(MemoryStream stream, string filename)} + private static IEnumerable<(MemoryStream stream, string filename)> IterateFileDescriptors(IEnumerable fileDescriptors, IDataObject dataObject) { if (fileDescriptors == null) { @@ -445,7 +456,7 @@ EndSelection:<<<<<<<4 if (fileData?.Length > 0) { fileData.Position = 0; - yield return fileData; + yield return (fileData, fileDescriptor.FileName); } fileIndex++; @@ -489,8 +500,12 @@ EndSelection:<<<<<<<4 public static Image GetImage() { IDataObject clipboardData = GetDataObject(); + if (clipboardData == null) + { + return null; + } // Return the first image - foreach (Image clipboardImage in GetImages(clipboardData)) + foreach (var clipboardImage in GetImages(clipboardData)) { return clipboardImage; } @@ -503,57 +518,152 @@ EndSelection:<<<<<<<4 /// Returned images must be disposed by the calling code! /// /// - /// IEnumerable of Image - public static IEnumerable GetImages(IDataObject dataObject) + /// IEnumerable of Bitmap + public static IEnumerable GetImages(IDataObject dataObject) { // Get single image, this takes the "best" match - Image singleImage = GetImage(dataObject); + Bitmap singleImage = GetImage(dataObject); if (singleImage != null) { - Log.InfoFormat("Got image from clipboard with size {0} and format {1}", singleImage.Size, singleImage.PixelFormat); + Log.Info($"Got {singleImage.GetType()} from clipboard with size {singleImage.Size}"); yield return singleImage; + yield break; } - else + + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + var supportedExtensions = fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadDrawableFromStream).ToList(); + + foreach (var (stream, filename) in IterateClipboardContent(dataObject)) { - foreach (var fileData in IterateClipboardContent(dataObject)) + var extension = Path.GetExtension(filename)?.ToLowerInvariant(); + if (!supportedExtensions.Contains(extension)) { - Image image; - try - { - image = ImageHelper.FromStream(fileData); - } - catch (Exception ex) - { - Log.Error("Couldn't read file contents", ex); - continue; - } - finally - { - fileData?.Dispose(); - } - // If we get here, there is an image - yield return image; + continue; } - // check if files are supplied - foreach (string imageFile in GetImageFilenames(dataObject)) + Bitmap bitmap = null; + + try { - Image returnImage = null; - try + if (!fileFormatHandlers.TryLoadFromStream(stream, extension, out bitmap)) { - returnImage = ImageHelper.LoadImage(imageFile); - } - catch (Exception streamImageEx) - { - Log.Error("Problem retrieving Image from clipboard.", streamImageEx); + continue; } - if (returnImage != null) + } + catch (Exception ex) + { + Log.Error("Couldn't read file contents", ex); + continue; + } + finally + { + stream?.Dispose(); + } + // If we get here, there is an image + yield return bitmap; + } + + // check if files are supplied + foreach (string imageFile in GetImageFilenames(dataObject)) + { + var extension = Path.GetExtension(imageFile)?.ToLowerInvariant(); + if (!supportedExtensions.Contains(extension)) + { + continue; + } + + Bitmap bitmap = null; + using FileStream fileStream = new FileStream(imageFile, FileMode.Open, FileAccess.Read, FileShare.Read); + try + { + if (!fileFormatHandlers.TryLoadFromStream(fileStream, extension, out bitmap)) { - Log.InfoFormat("Got image from clipboard with size {0} and format {1}", returnImage.Size, returnImage.PixelFormat); - yield return returnImage; + continue; } } + catch (Exception ex) + { + Log.Error("Couldn't read file contents", ex); + continue; + } + // If we get here, there is an image + yield return bitmap; + } + } + + /// + /// Get all images (multiple if file names are available) from the dataObject + /// Returned images must be disposed by the calling code! + /// + /// + /// IEnumerable of IDrawableContainer + public static IEnumerable GetDrawables(IDataObject dataObject) + { + // Get single image, this takes the "best" match + IDrawableContainer singleImage = GetDrawable(dataObject); + if (singleImage != null) + { + Log.InfoFormat($"Got {singleImage.GetType()} from clipboard with size {singleImage.Size}"); + yield return singleImage; + yield break; + } + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + var supportedExtensions = fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadDrawableFromStream).ToList(); + + foreach (var (stream, filename) in IterateClipboardContent(dataObject)) + { + var extension = Path.GetExtension(filename)?.ToLowerInvariant(); + if (!supportedExtensions.Contains(extension)) + { + continue; + } + + IEnumerable drawableContainers; + try + { + drawableContainers = fileFormatHandlers.LoadDrawablesFromStream(stream, extension); + } + catch (Exception ex) + { + Log.Error("Couldn't read file contents", ex); + continue; + } + finally + { + stream?.Dispose(); + } + // If we get here, there is an image + foreach (var container in drawableContainers) + { + yield return container; + } + } + + // check if files are supplied + foreach (string imageFile in GetImageFilenames(dataObject)) + { + var extension = Path.GetExtension(imageFile)?.ToLowerInvariant(); + if (!supportedExtensions.Contains(extension)) + { + continue; + } + using FileStream fileStream = new FileStream(imageFile, FileMode.Open, FileAccess.Read, FileShare.Read); + IEnumerable drawableContainers; + try + { + drawableContainers = fileFormatHandlers.LoadDrawablesFromStream(fileStream, extension); + } + catch (Exception ex) + { + Log.Error("Couldn't read file contents", ex); + continue; + } + // If we get here, there is an image + foreach (var container in drawableContainers) + { + yield return container; + } } } @@ -562,51 +672,50 @@ EndSelection:<<<<<<<4 /// /// /// Image or null - private static Image GetImage(IDataObject dataObject) + private static Bitmap GetImage(IDataObject dataObject) { - Image returnImage = null; - if (dataObject != null) - { - IList formats = GetFormats(dataObject); - string[] retrieveFormats; + if (dataObject == null) return null; - // Found a weird bug, where PNG's from Outlook 2010 are clipped - // So I build some special logic to get the best format: - if (formats != null && formats.Contains(FORMAT_PNG_OFFICEART) && formats.Contains(DataFormats.Dib)) + Bitmap returnImage = null; + IList formats = GetFormats(dataObject); + string[] retrieveFormats; + + // Found a weird bug, where PNG's from Outlook 2010 are clipped + // So I build some special logic to get the best format: + if (formats != null && formats.Contains(FORMAT_PNG_OFFICEART) && formats.Contains(DataFormats.Dib)) + { + // Outlook ?? + Log.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); + retrieveFormats = new[] { - // Outlook ?? - Log.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); - retrieveFormats = new[] - { - DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, - DataFormats.Tiff, FORMAT_GIF, FORMAT_HTML - }; + DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, + DataFormats.Tiff, FORMAT_GIF, FORMAT_HTML + }; + } + else + { + retrieveFormats = new[] + { + FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, + FORMAT_FILECONTENTS, FORMAT_GIF, FORMAT_HTML + }; + } + + foreach (string currentFormat in retrieveFormats) + { + if (formats != null && formats.Contains(currentFormat)) + { + Log.InfoFormat("Found {0}, trying to retrieve.", currentFormat); + returnImage = GetImageForFormat(currentFormat, dataObject); } else { - retrieveFormats = new[] - { - FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, - FORMAT_FILECONTENTS, FORMAT_GIF, FORMAT_HTML - }; + Log.DebugFormat("Couldn't find format {0}.", currentFormat); } - foreach (string currentFormat in retrieveFormats) + if (returnImage != null) { - if (formats != null && formats.Contains(currentFormat)) - { - Log.InfoFormat("Found {0}, trying to retrieve.", currentFormat); - returnImage = GetImageForFormat(currentFormat, dataObject); - } - else - { - Log.DebugFormat("Couldn't find format {0}.", currentFormat); - } - - if (returnImage != null) - { - return returnImage; - } + return returnImage; } } @@ -614,15 +723,72 @@ EndSelection:<<<<<<<4 } /// - /// Helper method to try to get an image in the specified format from the dataObject + /// Get an IDrawableContainer from the IDataObject, don't check for FileDrop + /// + /// + /// Image or null + private static IDrawableContainer GetDrawable(IDataObject dataObject) + { + if (dataObject == null) return null; + + IDrawableContainer returnImage = null; + IList formats = GetFormats(dataObject); + string[] retrieveFormats; + + // Found a weird bug, where PNG's from Outlook 2010 are clipped + // So I build some special logic to get the best format: + if (formats != null && formats.Contains(FORMAT_PNG_OFFICEART) && formats.Contains(DataFormats.Dib)) + { + // Outlook ?? + Log.Info("Most likely the current clipboard contents come from Outlook, as this has a problem with PNG and others we place the DIB format to the front..."); + retrieveFormats = new[] + { + DataFormats.Dib, FORMAT_BITMAP, FORMAT_FILECONTENTS, FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, + DataFormats.Tiff, FORMAT_GIF, FORMAT_HTML + }; + } + else + { + retrieveFormats = new[] + { + FORMAT_PNG_OFFICEART, FORMAT_PNG, FORMAT_17, FORMAT_JFIF_OFFICEART, FORMAT_JPG, FORMAT_JPEG, FORMAT_JFIF, DataFormats.Tiff, DataFormats.Dib, FORMAT_BITMAP, + FORMAT_FILECONTENTS, FORMAT_GIF, FORMAT_HTML + }; + } + + foreach (string currentFormat in retrieveFormats) + { + if (formats != null && formats.Contains(currentFormat)) + { + Log.InfoFormat("Found {0}, trying to retrieve.", currentFormat); + returnImage = GetDrawableForFormat(currentFormat, dataObject); + } + else + { + Log.DebugFormat("Couldn't find format {0}.", currentFormat); + } + + if (returnImage != null) + { + return returnImage; + } + } + + return null; + } + + /// + /// Helper method to try to get an Bitmap in the specified format from the dataObject /// the DIB reader should solve some issues /// It also supports Format17/DibV5, by using the following information: https://stackoverflow.com/a/14335591 /// /// string with the format /// IDataObject - /// Image or null - private static Image GetImageForFormat(string format, IDataObject dataObject) + /// Bitmap or null + private static Bitmap GetImageForFormat(string format, IDataObject dataObject) { + Bitmap bitmap = null; + if (format == FORMAT_HTML) { var textObject = ContentAsString(dataObject, FORMAT_HTML, Encoding.UTF8); @@ -638,10 +804,10 @@ EndSelection:<<<<<<<4 var srcAttribute = imgNode.Attributes["src"]; var imageUrl = srcAttribute.Value; Log.Debug(imageUrl); - var image = NetworkHelper.DownloadImage(imageUrl); - if (image != null) + bitmap = NetworkHelper.DownloadImage(imageUrl); + if (bitmap != null) { - return image; + return bitmap; } } } @@ -652,111 +818,80 @@ EndSelection:<<<<<<<4 var imageStream = clipboardObject as MemoryStream; if (!IsValidStream(imageStream)) { - // TODO: add "HTML Format" support here... - return clipboardObject as Image; + return clipboardObject as Bitmap; } + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); - if (CoreConfig.EnableSpecialDIBClipboardReader) + // From here, imageStream is a valid stream + if (fileFormatHandlers.TryLoadFromStream(imageStream, format, out bitmap)) { - if (format == FORMAT_17 || format == DataFormats.Dib) + return bitmap; + } + return null; + } + + /// + /// Helper method to try to get an IDrawableContainer in the specified format from the dataObject + /// the DIB reader should solve some issues + /// It also supports Format17/DibV5, by using the following information: https://stackoverflow.com/a/14335591 + /// + /// string with the format + /// IDataObject + /// IDrawableContainer or null + private static IDrawableContainer GetDrawableForFormat(string format, IDataObject dataObject) + { + IDrawableContainer drawableContainer = null; + + if (format == FORMAT_HTML) + { + var textObject = ContentAsString(dataObject, FORMAT_HTML, Encoding.UTF8); + if (textObject != null) { - Log.Info("Found DIB stream, trying to process it."); - try + var doc = new HtmlDocument(); + doc.LoadHtml(textObject); + var imgNodes = doc.DocumentNode.SelectNodes("//img"); + if (imgNodes != null) { - if (imageStream != null) + foreach (var imgNode in imgNodes) { - byte[] dibBuffer = new byte[imageStream.Length]; - imageStream.Read(dibBuffer, 0, dibBuffer.Length); - var infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); - if (!infoHeader.IsDibV5) + var srcAttribute = imgNode.Attributes["src"]; + var imageUrl = srcAttribute.Value; + Log.Debug(imageUrl); + drawableContainer = NetworkHelper.DownloadImageAsDrawableContainer(imageUrl); + if (drawableContainer != null) { - Log.InfoFormat("Using special DIB (); + + return fileFormatHandlers.LoadDrawablesFromStream(imageStream, format).FirstOrDefault(); } /// @@ -815,8 +950,6 @@ EndSelection:<<<<<<<4 return sb.ToString(); } - private const int BITMAPFILEHEADER_LENGTH = 14; - /// /// Set an Image to the clipboard /// This method will place images to the clipboard depending on the ClipboardFormats setting. @@ -842,7 +975,7 @@ EndSelection:<<<<<<<4 { SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); // Create the image which is going to be saved so we don't create it multiple times - disposeImage = ImageOutput.CreateImageFromSurface(surface, outputSettings, out imageToSave); + disposeImage = ImageIO.CreateImageFromSurface(surface, outputSettings, out imageToSave); try { // Create PNG stream @@ -851,7 +984,7 @@ EndSelection:<<<<<<<4 pngStream = new MemoryStream(); // PNG works for e.g. Powerpoint SurfaceOutputSettings pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); - ImageOutput.SaveToStream(imageToSave, null, pngStream, pngOutputSettings); + ImageIO.SaveToStream(imageToSave, null, pngStream, pngOutputSettings); pngStream.Seek(0, SeekOrigin.Begin); // Set the PNG stream dataObject.SetData(FORMAT_PNG, false, pngStream); @@ -866,19 +999,20 @@ EndSelection:<<<<<<<4 { if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.DIB)) { - using (MemoryStream tmpBmpStream = new MemoryStream()) + // Create the stream for the clipboard + dibStream = new MemoryStream(); + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + + if (!fileFormatHandlers.TrySaveToStream((Bitmap)imageToSave, dibStream, DataFormats.Dib)) { - // Save image as BMP - SurfaceOutputSettings bmpOutputSettings = new SurfaceOutputSettings(OutputFormat.bmp, 100, false); - ImageOutput.SaveToStream(imageToSave, null, tmpBmpStream, bmpOutputSettings); - - dibStream = new MemoryStream(); - // Copy the source, but skip the "BITMAPFILEHEADER" which has a size of 14 - dibStream.Write(tmpBmpStream.GetBuffer(), BITMAPFILEHEADER_LENGTH, (int) tmpBmpStream.Length - BITMAPFILEHEADER_LENGTH); + dibStream.Dispose(); + dibStream = null; + } + else + { + // Set the DIB to the clipboard DataObject + dataObject.SetData(DataFormats.Dib, false, dibStream); } - - // Set the DIB to the clipboard DataObject - dataObject.SetData(DataFormats.Dib, true, dibStream); } } catch (Exception dibEx) @@ -895,20 +1029,17 @@ EndSelection:<<<<<<<4 dibV5Stream = new MemoryStream(); // Create the BITMAPINFOHEADER - BITMAPINFOHEADER header = new BITMAPINFOHEADER(imageToSave.Width, imageToSave.Height, 32) - { - // Make sure we have BI_BITFIELDS, this seems to be normal for Format17? - biCompression = BI_COMPRESSION.BI_BITFIELDS - }; + var header = BitmapV5Header.Create(imageToSave.Width, imageToSave.Height, 32); + // Make sure we have BI_BITFIELDS, this seems to be normal for Format17? + header.Compression = BitmapCompressionMethods.BI_BITFIELDS; // Create a byte[] to write byte[] headerBytes = BinaryStructHelper.ToByteArray(header); // Write the BITMAPINFOHEADER to the stream dibV5Stream.Write(headerBytes, 0, headerBytes.Length); // As we have specified BI_COMPRESSION.BI_BITFIELDS, the BitfieldColorMask needs to be added + // This also makes sure the default values are set BitfieldColorMask colorMask = new BitfieldColorMask(); - // Make sure the values are set - colorMask.InitValues(); // Create the byte[] from the struct byte[] colorMaskBytes = BinaryStructHelper.ToByteArray(colorMask); Array.Reverse(colorMaskBytes); @@ -932,7 +1063,7 @@ EndSelection:<<<<<<<4 // Set the HTML if (CoreConfig.ClipboardFormats.Contains(ClipboardFormat.HTML)) { - string tmpFile = ImageOutput.SaveToTmpFile(surface, new SurfaceOutputSettings(OutputFormat.png, 100, false), null); + string tmpFile = ImageIO.SaveToTmpFile(surface, new SurfaceOutputSettings(OutputFormat.png, 100, false), null); string html = GetHtmlString(surface, tmpFile); dataObject.SetText(html, TextDataFormat.Html); } @@ -950,11 +1081,11 @@ EndSelection:<<<<<<<4 // Check if we can use the previously used image if (imageToSave.PixelFormat != PixelFormat.Format8bppIndexed) { - ImageOutput.SaveToStream(imageToSave, surface, tmpPngStream, pngOutputSettings); + ImageIO.SaveToStream(imageToSave, surface, tmpPngStream, pngOutputSettings); } else { - ImageOutput.SaveToStream(surface, tmpPngStream, pngOutputSettings); + ImageIO.SaveToStream(surface, tmpPngStream, pngOutputSettings); } html = GetHtmlDataUrlString(surface, tmpPngStream); @@ -999,7 +1130,7 @@ EndSelection:<<<<<<<4 private static byte[] BitmapToByteArray(Bitmap bitmap) { // Lock the bitmap's bits. - Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + var rect = new NativeRect(0, 0, bitmap.Width, bitmap.Height); BitmapData bmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, bitmap.PixelFormat); int absStride = Math.Abs(bmpData.Stride); @@ -1091,7 +1222,7 @@ EndSelection:<<<<<<<4 public static bool ContainsFormat(IDataObject dataObject, string[] formats) { bool formatFound = false; - List currentFormats = GetFormats(dataObject); + var currentFormats = GetFormats(dataObject); if (currentFormats == null || currentFormats.Count == 0 || formats == null || formats.Length == 0) { return false; @@ -1132,16 +1263,16 @@ EndSelection:<<<<<<<4 /// public static IEnumerable GetImageFilenames(IDataObject dataObject) { - string[] dropFileNames = (string[]) dataObject.GetData(DataFormats.FileDrop); - if (dropFileNames != null && dropFileNames.Length > 0) - { - return dropFileNames - .Where(filename => !string.IsNullOrEmpty(filename)) - .Where(Path.HasExtension) - .Where(filename => ImageHelper.StreamConverters.Keys.Contains(Path.GetExtension(filename).ToLowerInvariant().Substring(1))); - } + string[] dropFileNames = (string[])dataObject.GetData(DataFormats.FileDrop); + if (dropFileNames is not { Length: > 0 }) return Enumerable.Empty(); + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + + var supportedExtensions = fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadFromStream).ToList(); + return dropFileNames + .Where(filename => !string.IsNullOrEmpty(filename)) + .Where(Path.HasExtension) + .Where(filename => supportedExtensions.Contains(Path.GetExtension(filename))); - return Enumerable.Empty(); } /// diff --git a/src/Greenshot.Base/Core/CoreConfiguration.cs b/src/Greenshot.Base/Core/CoreConfiguration.cs index 4776a3985..3e085bc9b 100644 --- a/src/Greenshot.Base/Core/CoreConfiguration.cs +++ b/src/Greenshot.Base/Core/CoreConfiguration.cs @@ -24,9 +24,9 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; -using System.Linq; using System.Reflection; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; @@ -59,7 +59,7 @@ namespace Greenshot.Base.Core [IniProperty("IEHotkey", Description = "Hotkey for starting the IE capture", DefaultValue = "Shift + Ctrl + PrintScreen")] public string IEHotkey { get; set; } - [IniProperty("ClipboardHotkey", Description = "Hotkey for opening the clipboard contents into the editor")] + [IniProperty("ClipboardHotkey", Description = "Hotkey for opening the clipboard contents into the editor", ExcludeIfNull = true)] public string ClipboardHotkey { get; set; } [IniProperty("IsFirstLaunch", Description = "Is this the first time launch?", DefaultValue = "true")] @@ -322,17 +322,17 @@ namespace Greenshot.Base.Core public bool ProcessEXIFOrientation { get; set; } [IniProperty("LastCapturedRegion", Description = "The last used region, for reuse in the capture last region")] - public Rectangle LastCapturedRegion { get; set; } + public NativeRect LastCapturedRegion { get; set; } [IniProperty("Win10BorderCrop", Description = "The capture is cropped with these settings, e.g. when you don't want to color around it -1,-1"), DefaultValue("0,0")] - public Size Win10BorderCrop { get; set; } + public NativeSize Win10BorderCrop { get; set; } - private Size _iconSize; + private NativeSize _iconSize; [IniProperty("BaseIconSize", Description = "Defines the base size of the icons (e.g. for the buttons in the editor), default value 16,16 and it's scaled to the current DPI", DefaultValue = "16,16")] - public Size IconSize + public NativeSize IconSize { get { return _iconSize; } set @@ -369,13 +369,11 @@ namespace Greenshot.Base.Core } } } - - public Size ScaledIconSize => DpiHelper.ScaleWithCurrentDpi(_iconSize); - - [IniProperty("WebRequestTimeout", Description = "The connect timeout value for webrequets, these are seconds", DefaultValue = "100")] + + [IniProperty("WebRequestTimeout", Description = "The connect timeout value for web requests, these are seconds", DefaultValue = "100")] public int WebRequestTimeout { get; set; } - [IniProperty("WebRequestReadWriteTimeout", Description = "The read/write timeout value for webrequets, these are seconds", DefaultValue = "100")] + [IniProperty("WebRequestReadWriteTimeout", Description = "The read/write timeout value for web requests, these are seconds", DefaultValue = "100")] public int WebRequestReadWriteTimeout { get; set; } public bool UseLargeIcons => IconSize.Width >= 32 || IconSize.Height >= 32; @@ -390,89 +388,64 @@ namespace Greenshot.Base.Core return ExperimentalFeatures != null && ExperimentalFeatures.Contains(experimentalFeature); } + private string CreateOutputFilePath() + { + if (IniConfig.IsPortable) + { + string pafOutputFilePath = Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots"); + if (!Directory.Exists(pafOutputFilePath)) + { + try + { + Directory.CreateDirectory(pafOutputFilePath); + return pafOutputFilePath; + } + catch (Exception ex) + { + // Problem creating directory, fallback to Desktop + LOG.Warn(ex); + } + } + else + { + return pafOutputFilePath; + } + } + + return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + } + /// /// Supply values we can't put as defaults /// /// The property to return a default for /// object with the default value for the supplied property - public override object GetDefault(string property) - { - switch (property) + public override object GetDefault(string property) => + property switch { - case nameof(ExcludePlugins): - case nameof(IncludePlugins): - return new List(); - case nameof(OutputFileAsFullpath): - if (IniConfig.IsPortable) - { - return Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots\dummy.png"); - } - - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "dummy.png"); - case nameof(OutputFilePath): - if (IniConfig.IsPortable) - { - string pafOutputFilePath = Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots"); - if (!Directory.Exists(pafOutputFilePath)) - { - try - { - Directory.CreateDirectory(pafOutputFilePath); - return pafOutputFilePath; - } - catch (Exception ex) - { - LOG.Warn(ex); - // Problem creating directory, fallback to Desktop - } - } - else - { - return pafOutputFilePath; - } - } - - return Environment.GetFolderPath(Environment.SpecialFolder.Desktop); - case nameof(DWMBackgroundColor): - return Color.Transparent; - case nameof(ActiveTitleFixes): - return new List - { - "Firefox", - "IE", - "Chrome" - }; - case nameof(TitleFixMatcher): - return new Dictionary - { - { - "Firefox", " - Mozilla Firefox.*" - }, - { - "IE", " - (Microsoft|Windows) Internet Explorer.*" - }, - { - "Chrome", " - Google Chrome.*" - } - }; - case nameof(TitleFixReplacer): - return new Dictionary - { - { - "Firefox", string.Empty - }, - { - "IE", string.Empty - }, - { - "Chrome", string.Empty - } - }; - } - - return null; - } - + nameof(ExcludePlugins) => new List(), + nameof(IncludePlugins) => new List(), + nameof(OutputFileAsFullpath) => IniConfig.IsPortable ? Path.Combine(Application.StartupPath, @"..\..\Documents\Pictures\Greenshots\dummy.png") : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "dummy.png"), + nameof(OutputFilePath) => CreateOutputFilePath(), + nameof(DWMBackgroundColor) => Color.Transparent, + nameof(ActiveTitleFixes) => new List { + "Firefox", + "IE", + "Chrome" + }, + nameof(TitleFixMatcher) => new Dictionary { + { "Firefox", " - Mozilla Firefox.*" }, + { "IE", " - (Microsoft|Windows) Internet Explorer.*" }, + { "Chrome", " - Google Chrome.*" } + }, + nameof(TitleFixReplacer) => new Dictionary { + { "Firefox", string.Empty }, + { "IE", string.Empty }, + { "Chrome", string.Empty } + }, + _ => null + }; + /// /// This method will be called before converting the property, making to possible to correct a certain value /// Can be used when migration is needed @@ -542,8 +515,9 @@ namespace Greenshot.Base.Core OutputFileAutoReduceColors = false; } + bool isUpgradeFrom12 = LastSaveWithVersion?.StartsWith("1.2") ?? false; // Fix for excessive feed checking - if (UpdateCheckInterval != 0 && UpdateCheckInterval <= 7 && LastSaveWithVersion.StartsWith("1.2")) + if (UpdateCheckInterval != 0 && UpdateCheckInterval <= 7 && isUpgradeFrom12) { UpdateCheckInterval = 14; } @@ -658,16 +632,6 @@ namespace Greenshot.Base.Core { WebRequestReadWriteTimeout = 100; } - - // Workaround for the Windows 11 clipboard issue found here: https://github.com/greenshot/greenshot/issues/348 - if (WindowsVersion.IsWindows11OrLater) - { - // If the format DIB is used, remove it and replace it with BITMAP. - if (ClipboardFormats.Contains(ClipboardFormat.DIB)) - { - ClipboardFormats = ClipboardFormats.Where(cf => cf != ClipboardFormat.DIB).Append(ClipboardFormat.BITMAP).ToList(); - } - } } /// diff --git a/src/Greenshot.Base/Core/DpiHelper.cs b/src/Greenshot.Base/Core/DpiHelper.cs deleted file mode 100644 index d3c7e61b6..000000000 --- a/src/Greenshot.Base/Core/DpiHelper.cs +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using Greenshot.Base.Core.Enums; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; - -namespace Greenshot.Base.Core -{ - /// - /// This handles DPI changes see - /// Writing DPI-Aware Desktop and Win32 Applications - /// - public static class DpiHelper - { - /// - /// This is the default DPI for the screen - /// - public const uint DefaultScreenDpi = 96; - - /// - /// Retrieve the current DPI for the UI element which is related to this DpiHandler - /// - public static uint Dpi { get; private set; } = WindowsVersion.IsWindows10OrLater ? GetDpiForSystem() : DefaultScreenDpi; - - /// - /// Calculate a DPI scale factor - /// - /// uint - /// double - public static float DpiScaleFactor(uint dpi) - { - if (dpi == 0) - { - dpi = Dpi; - } - - return (float) dpi / DefaultScreenDpi; - } - - /// - /// Scale the supplied number according to the supplied dpi - /// - /// double with e.g. the width 16 for 16x16 images - /// current dpi, normal is 96. - /// A function which can modify the scale factor - /// double with the scaled number - public static float ScaleWithDpi(float someNumber, uint dpi, Func scaleModifier = null) - { - var dpiScaleFactor = DpiScaleFactor(dpi); - if (scaleModifier != null) - { - dpiScaleFactor = scaleModifier(dpiScaleFactor); - } - - return dpiScaleFactor * someNumber; - } - - /// - /// Scale the supplied Size according to the supplied dpi - /// - /// Size to resize - /// current dpi, normal is 96. - /// A function which can modify the scale factor - /// NativeSize scaled - public static Size ScaleWithDpi(Size size, uint dpi, Func scaleModifier = null) - { - var dpiScaleFactor = DpiScaleFactor(dpi); - if (scaleModifier != null) - { - dpiScaleFactor = scaleModifier(dpiScaleFactor); - } - - return new Size((int) (dpiScaleFactor * size.Width), (int) (dpiScaleFactor * size.Height)); - } - - /// - /// Scale the supplied NativeSize to the current dpi - /// - /// NativeSize to scale - /// A function which can modify the scale factor - /// NativeSize scaled - public static Size ScaleWithCurrentDpi(Size size, Func scaleModifier = null) - { - return ScaleWithDpi(size, Dpi, scaleModifier); - } - - /// - /// Return the DPI for the screen which the location is located on - /// - /// POINT - /// uint - public static uint GetDpi(POINT location) - { - if (!WindowsVersion.IsWindows81OrLater) - { - return DefaultScreenDpi; - } - RECT rect = new RECT(location.X, location.Y, 1, 1); - IntPtr hMonitor = User32.MonitorFromRect(ref rect, User32.MONITOR_DEFAULTTONEAREST); - var result = GetDpiForMonitor(hMonitor, MonitorDpiType.EffectiveDpi, out var dpiX, out var dpiY); - if (result.Succeeded()) - { - return dpiX; - } - - return DefaultScreenDpi; - } - - - /// - /// Retrieve the DPI value for the supplied window handle - /// - /// IntPtr - /// dpi value - public static uint GetDpi(IntPtr hWnd) - { - if (!User32.IsWindow(hWnd)) - { - return DefaultScreenDpi; - } - - // Use the easiest method, but this only works for Windows 10 - if (WindowsVersion.IsWindows10OrLater) - { - return GetDpiForWindow(hWnd); - } - - // Use the second easiest method, but this only works for Windows 8.1 or later - if (WindowsVersion.IsWindows81OrLater) - { - var hMonitor = User32.MonitorFromWindow(hWnd, MonitorFrom.DefaultToNearest); - // ReSharper disable once UnusedVariable - var result = GetDpiForMonitor(hMonitor, MonitorDpiType.EffectiveDpi, out var dpiX, out var dpiY); - if (result.Succeeded()) - { - return dpiX; - } - } - - // Fallback to the global DPI settings - using var hdc = SafeWindowDcHandle.FromWindow(hWnd); - if (hdc == null) - { - return DefaultScreenDpi; - } - - return (uint) GDI32.GetDeviceCaps(hdc, DeviceCaps.LOGPIXELSX); - } - - /// - /// See more at GetDpiForWindow function - /// Returns the dots per inch (dpi) value for the associated window. - /// - /// IntPtr - /// uint with dpi - [DllImport("user32.dll")] - private static extern uint GetDpiForWindow(IntPtr hWnd); - - /// - /// See - /// GetDpiForMonitor function - /// Queries the dots per inch (dpi) of a display. - /// - /// IntPtr - /// MonitorDpiType - /// out int for the horizontal dpi - /// out int for the vertical dpi - /// true if all okay - [DllImport("shcore.dll", SetLastError = true)] - private static extern HResult GetDpiForMonitor(IntPtr hMonitor, MonitorDpiType dpiType, out uint dpiX, out uint dpiY); - - /// - /// See GetDpiForSystem function - /// Returns the system DPI. - /// - /// uint with the system DPI - [DllImport("user32.dll")] - private static extern uint GetDpiForSystem(); - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/EffectConverter.cs b/src/Greenshot.Base/Core/EffectConverter.cs index 40cb1f5ae..e5742b803 100644 --- a/src/Greenshot.Base/Core/EffectConverter.cs +++ b/src/Greenshot.Base/Core/EffectConverter.cs @@ -3,6 +3,8 @@ using System.ComponentModel; using System.Drawing; using System.Globalization; using System.Text; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Effects; namespace Greenshot.Base.Core @@ -136,16 +138,16 @@ namespace Greenshot.Base.Core break; case "ShadowOffset": - Point shadowOffset = new Point(); + NativePoint shadowOffset = new NativePoint(); string[] coordinates = pair[1].Split(','); if (int.TryParse(coordinates[0], out var shadowOffsetX)) { - shadowOffset.X = shadowOffsetX; + shadowOffset = shadowOffset.ChangeX(shadowOffsetX); } if (int.TryParse(coordinates[1], out var shadowOffsetY)) { - shadowOffset.Y = shadowOffsetY; + shadowOffset = shadowOffset.ChangeY(shadowOffsetY); } effect.ShadowOffset = shadowOffset; diff --git a/src/Greenshot.Base/Core/Enums/ExifOrientations.cs b/src/Greenshot.Base/Core/Enums/ExifOrientations.cs new file mode 100644 index 000000000..b566619da --- /dev/null +++ b/src/Greenshot.Base/Core/Enums/ExifOrientations.cs @@ -0,0 +1,36 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace Greenshot.Base.Core.Enums +{ + internal enum ExifOrientations : byte + { + Unknown = 0, + TopLeft = 1, + TopRight = 2, + BottomRight = 3, + BottomLeft = 4, + LeftTop = 5, + RightTop = 6, + RightBottom = 7, + LeftBottom = 8, + } +} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/Enums/HResult.cs b/src/Greenshot.Base/Core/Enums/HResult.cs deleted file mode 100644 index a971c8801..000000000 --- a/src/Greenshot.Base/Core/Enums/HResult.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Greenshot - a free and open source screenshot tool -// Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom -// -// For more information see: https://getgreenshot.org/ -// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 1 of the License, or -// (at your option) any later version. -// -// 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.Core.Enums -{ - /// - /// The HRESULT represents Windows error codes - /// See wikipedia - /// - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum HResult - { - S_OK = 0, - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/Enums/MonitorDpiType.cs b/src/Greenshot.Base/Core/Enums/MonitorDpiType.cs deleted file mode 100644 index e434f5bb3..000000000 --- a/src/Greenshot.Base/Core/Enums/MonitorDpiType.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Dapplo and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace Greenshot.Base.Core.Enums -{ - /// - /// See - /// - /// MONITOR_DPI_TYPE - /// enumeration - /// - /// - [Flags] - public enum MonitorDpiType - { - /// - /// The effective DPI. - /// This value should be used when determining the correct scale factor for scaling UI elements. - /// This incorporates the scale factor set by the user for this specific display. - /// - EffectiveDpi = 0, - - /// - /// The angular DPI. - /// This DPI ensures rendering at a compliant angular resolution on the screen. - /// This does not include the scale factor set by the user for this specific display - /// - AngularDpi = 1, - - /// - /// The raw DPI. - /// This value is the linear DPI of the screen as measured on the screen itself. - /// Use this value when you want to read the pixel density and not the recommended scaling setting. - /// This does not include the scale factor set by the user for this specific display and is not guaranteed to be a - /// supported DPI value. - /// - RawDpi = 2 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/Enums/MonitorFrom.cs b/src/Greenshot.Base/Core/Enums/MonitorFrom.cs deleted file mode 100644 index f9d9fcc2b..000000000 --- a/src/Greenshot.Base/Core/Enums/MonitorFrom.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Dapplo and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace Greenshot.Base.Core.Enums -{ - /// - /// Flags for the MonitorFromRect / MonitorFromWindow "flags" field - /// see MonitorFromRect function - /// or see MonitorFromWindow function - /// - [Flags] - public enum MonitorFrom : uint - { - /// - /// Returns a handle to the display monitor that is nearest to the rectangle. - /// - DefaultToNearest = 0, - - /// - /// Returns NULL. (why??) - /// - DefaultToNull = 1, - - /// - /// Returns a handle to the primary display monitor. - /// - DefaultToPrimary = 2 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/Enums/OutputFormat.cs b/src/Greenshot.Base/Core/Enums/OutputFormat.cs index 64d8a614b..6e2353eb8 100644 --- a/src/Greenshot.Base/Core/Enums/OutputFormat.cs +++ b/src/Greenshot.Base/Core/Enums/OutputFormat.cs @@ -31,6 +31,7 @@ namespace Greenshot.Base.Core.Enums jpg, png, tiff, + jxr, greenshot, ico } diff --git a/src/Greenshot.Base/Core/EnvironmentInfo.cs b/src/Greenshot.Base/Core/EnvironmentInfo.cs index 3452180fa..30811fb69 100644 --- a/src/Greenshot.Base/Core/EnvironmentInfo.cs +++ b/src/Greenshot.Base/Core/EnvironmentInfo.cs @@ -23,8 +23,12 @@ using System; using System.Reflection; using System.Runtime.InteropServices; using System.Text; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.Kernel32.Enums; +using Dapplo.Windows.Kernel32.Structs; +using Dapplo.Windows.User32; +using Dapplo.Windows.Common.Extensions; using Greenshot.Base.IniFile; -using Greenshot.Base.UnmanagedHelpers; using Microsoft.Win32; namespace Greenshot.Base.Core @@ -73,7 +77,7 @@ namespace Greenshot.Base.Core { greenshotVersion = assemblyFileVersion.ToString(3); } - catch (Exception ex) + catch (Exception) { // Ignore } @@ -94,7 +98,7 @@ namespace Greenshot.Base.Core public static string EnvironmentToString(bool newline) { - StringBuilder environment = new StringBuilder(); + StringBuilder environment = new(); environment.Append("Software version: " + GetGreenshotVersion()); if (IniConfig.IsPortable) { @@ -163,7 +167,7 @@ namespace Greenshot.Base.Core } // Get some important information for fixing GDI related Problems - environment.AppendFormat("GDI object count: {0}", User32.GetGuiResourcesGDICount()); + environment.AppendFormat("GDI object count: {0}", User32Api.GetGuiResourcesGdiCount()); if (newline) { environment.AppendLine(); @@ -173,7 +177,7 @@ namespace Greenshot.Base.Core environment.Append(", "); } - environment.AppendFormat("User object count: {0}", User32.GetGuiResourcesUserCount()); + environment.AppendFormat("User object count: {0}", User32Api.GetGuiResourcesUserCount()); } else { @@ -208,7 +212,7 @@ namespace Greenshot.Base.Core if (ex == null) return "null\r\n"; - StringBuilder report = new StringBuilder(); + StringBuilder report = new(); report.AppendLine("Exception: " + ex.GetType()); report.AppendLine("Message: " + ex.Message); @@ -254,7 +258,7 @@ namespace Greenshot.Base.Core public static string BuildReport(Exception exception) { - StringBuilder exceptionText = new StringBuilder(); + StringBuilder exceptionText = new(); exceptionText.AppendLine(EnvironmentToString(true)); exceptionText.AppendLine(ExceptionToString(exception)); exceptionText.AppendLine("Configuration dump:"); @@ -291,33 +295,33 @@ namespace Greenshot.Base.Core string edition = string.Empty; OperatingSystem osVersion = Environment.OSVersion; - OSVERSIONINFOEX osVersionInfo = OSVERSIONINFOEX.Create(); + var osVersionInfo = OsVersionInfoEx.Create(); - if (GetVersionEx(ref osVersionInfo)) + if (Kernel32Api.GetVersionEx(ref osVersionInfo)) { int majorVersion = osVersion.Version.Major; int minorVersion = osVersion.Version.Minor; - byte productType = osVersionInfo.ProductType; - ushort suiteMask = osVersionInfo.SuiteMask; + var productType = osVersionInfo.ProductType; + var suiteMask = osVersionInfo.SuiteMask; if (majorVersion == 4) { - if (productType == VER_NT_WORKSTATION) + if (productType == WindowsProductTypes.VER_NT_WORKSTATION) { // Windows NT 4.0 Workstation edition = "Workstation"; } - else if (productType == VER_NT_SERVER) + else if (productType == WindowsProductTypes.VER_NT_SERVER) { - edition = (suiteMask & VER_SUITE_ENTERPRISE) != 0 ? "Enterprise Server" : "Standard Server"; + edition = (suiteMask & WindowsSuites.Enterprise) != 0 ? "Enterprise Server" : "Standard Server"; } } else if (majorVersion == 5) { - if (productType == VER_NT_WORKSTATION) + if (productType == WindowsProductTypes.VER_NT_WORKSTATION) { - if ((suiteMask & VER_SUITE_PERSONAL) != 0) + if ((suiteMask & WindowsSuites.Personal) != 0) { // Windows XP Home Edition edition = "Home"; @@ -328,16 +332,16 @@ namespace Greenshot.Base.Core edition = "Professional"; } } - else if (productType == VER_NT_SERVER) + else if (productType == WindowsProductTypes.VER_NT_SERVER) { if (minorVersion == 0) { - if ((suiteMask & VER_SUITE_DATACENTER) != 0) + if ((suiteMask & WindowsSuites.DataCenter) != 0) { // Windows 2000 Datacenter Server edition = "Datacenter Server"; } - else if ((suiteMask & VER_SUITE_ENTERPRISE) != 0) + else if ((suiteMask & WindowsSuites.Enterprise) != 0) { // Windows 2000 Advanced Server edition = "Advanced Server"; @@ -350,17 +354,17 @@ namespace Greenshot.Base.Core } else { - if ((suiteMask & VER_SUITE_DATACENTER) != 0) + if ((suiteMask & WindowsSuites.DataCenter) != 0) { // Windows Server 2003 Datacenter Edition edition = "Datacenter"; } - else if ((suiteMask & VER_SUITE_ENTERPRISE) != 0) + else if ((suiteMask & WindowsSuites.Enterprise) != 0) { // Windows Server 2003 Enterprise Edition edition = "Enterprise"; } - else if ((suiteMask & VER_SUITE_BLADE) != 0) + else if ((suiteMask & WindowsSuites.Blade) != 0) { // Windows Server 2003 Web Edition edition = "Web Edition"; @@ -376,122 +380,9 @@ namespace Greenshot.Base.Core else if (majorVersion == 6) { - if (GetProductInfo(majorVersion, minorVersion, osVersionInfo.ServicePackMajor, osVersionInfo.ServicePackMinor, out var ed)) + if (Kernel32Api.GetProductInfo(majorVersion, minorVersion, osVersionInfo.ServicePackMajor, osVersionInfo.ServicePackMinor, out var windowsProduct)) { - switch (ed) - { - case PRODUCT_BUSINESS: - edition = "Business"; - break; - case PRODUCT_BUSINESS_N: - edition = "Business N"; - break; - case PRODUCT_CLUSTER_SERVER: - edition = "HPC Edition"; - break; - case PRODUCT_DATACENTER_SERVER: - edition = "Datacenter Server"; - break; - case PRODUCT_DATACENTER_SERVER_CORE: - edition = "Datacenter Server (core installation)"; - break; - case PRODUCT_ENTERPRISE: - edition = "Enterprise"; - break; - case PRODUCT_ENTERPRISE_N: - edition = "Enterprise N"; - break; - case PRODUCT_ENTERPRISE_SERVER: - edition = "Enterprise Server"; - break; - case PRODUCT_ENTERPRISE_SERVER_CORE: - edition = "Enterprise Server (core installation)"; - break; - case PRODUCT_ENTERPRISE_SERVER_CORE_V: - edition = "Enterprise Server without Hyper-V (core installation)"; - break; - case PRODUCT_ENTERPRISE_SERVER_IA64: - edition = "Enterprise Server for Itanium-based Systems"; - break; - case PRODUCT_ENTERPRISE_SERVER_V: - edition = "Enterprise Server without Hyper-V"; - break; - case PRODUCT_HOME_BASIC: - edition = "Home Basic"; - break; - case PRODUCT_HOME_BASIC_N: - edition = "Home Basic N"; - break; - case PRODUCT_HOME_PREMIUM: - edition = "Home Premium"; - break; - case PRODUCT_HOME_PREMIUM_N: - edition = "Home Premium N"; - break; - case PRODUCT_HYPERV: - edition = "Microsoft Hyper-V Server"; - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT: - edition = "Windows Essential Business Management Server"; - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING: - edition = "Windows Essential Business Messaging Server"; - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY: - edition = "Windows Essential Business Security Server"; - break; - case PRODUCT_SERVER_FOR_SMALLBUSINESS: - edition = "Windows Essential Server Solutions"; - break; - case PRODUCT_SERVER_FOR_SMALLBUSINESS_V: - edition = "Windows Essential Server Solutions without Hyper-V"; - break; - case PRODUCT_SMALLBUSINESS_SERVER: - edition = "Windows Small Business Server"; - break; - case PRODUCT_STANDARD_SERVER: - edition = "Standard Server"; - break; - case PRODUCT_STANDARD_SERVER_CORE: - edition = "Standard Server (core installation)"; - break; - case PRODUCT_STANDARD_SERVER_CORE_V: - edition = "Standard Server without Hyper-V (core installation)"; - break; - case PRODUCT_STANDARD_SERVER_V: - edition = "Standard Server without Hyper-V"; - break; - case PRODUCT_STARTER: - edition = "Starter"; - break; - case PRODUCT_STORAGE_ENTERPRISE_SERVER: - edition = "Enterprise Storage Server"; - break; - case PRODUCT_STORAGE_EXPRESS_SERVER: - edition = "Express Storage Server"; - break; - case PRODUCT_STORAGE_STANDARD_SERVER: - edition = "Standard Storage Server"; - break; - case PRODUCT_STORAGE_WORKGROUP_SERVER: - edition = "Workgroup Storage Server"; - break; - case PRODUCT_UNDEFINED: - edition = "Unknown product"; - break; - case PRODUCT_ULTIMATE: - edition = "Ultimate"; - break; - case PRODUCT_ULTIMATE_N: - edition = "Ultimate N"; - break; - case PRODUCT_WEB_SERVER: - edition = "Web Server"; - break; - case PRODUCT_WEB_SERVER_CORE: - edition = "Web Server (core installation)"; - break; - } + edition = windowsProduct.GetEnumDescription(); } } } @@ -518,13 +409,13 @@ namespace Greenshot.Base.Core string name = "unknown"; OperatingSystem osVersion = Environment.OSVersion; - OSVERSIONINFOEX osVersionInfo = OSVERSIONINFOEX.Create(); - if (GetVersionEx(ref osVersionInfo)) + var osVersionInfo = OsVersionInfoEx.Create(); + if (Kernel32Api.GetVersionEx(ref osVersionInfo)) { int majorVersion = osVersion.Version.Major; int minorVersion = osVersion.Version.Minor; - byte productType = osVersionInfo.ProductType; - ushort suiteMask = osVersionInfo.SuiteMask; + var productType = osVersionInfo.ProductType; + var suiteMask = osVersionInfo.SuiteMask; switch (osVersion.Platform) { case PlatformID.Win32Windows: @@ -563,10 +454,10 @@ namespace Greenshot.Base.Core case 4: switch (productType) { - case 1: + case WindowsProductTypes.VER_NT_WORKSTATION: name = "Windows NT 4.0"; break; - case 3: + case WindowsProductTypes.VER_NT_SERVER: name = "Windows NT 4.0 Server"; break; } @@ -581,18 +472,18 @@ namespace Greenshot.Base.Core case 1: name = suiteMask switch { - 0x0200 => "Windows XP Professional", + WindowsSuites.Personal => "Windows XP Professional", _ => "Windows XP" }; break; case 2: name = suiteMask switch { - 0x0200 => "Windows XP Professional x64", - 0x0002 => "Windows Server 2003 Enterprise", - 0x0080 => "Windows Server 2003 Data Center", - 0x0400 => "Windows Server 2003 Web Edition", - 0x8000 => "Windows Home Server", + WindowsSuites.Personal => "Windows XP Professional x64", + WindowsSuites.Enterprise => "Windows Server 2003 Enterprise", + WindowsSuites.DataCenter => "Windows Server 2003 Data Center", + WindowsSuites.Blade => "Windows Server 2003 Web Edition", + WindowsSuites.WHServer => "Windows Home Server", _ => "Windows Server 2003" }; break; @@ -605,14 +496,14 @@ namespace Greenshot.Base.Core case 0: name = productType switch { - 3 => "Windows Server 2008", + WindowsProductTypes.VER_NT_SERVER => "Windows Server 2008", _ => "Windows Vista" }; break; case 1: name = productType switch { - 3 => "Windows Server 2008 R2", + WindowsProductTypes.VER_NT_SERVER => "Windows Server 2008 R2", _ => "Windows 7" }; break; @@ -640,134 +531,6 @@ namespace Greenshot.Base.Core } } - [DllImport("Kernel32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - internal static extern bool GetProductInfo( - int osMajorVersion, - int osMinorVersion, - int spMajorVersion, - int spMinorVersion, - out int edition); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool GetVersionEx(ref OSVERSIONINFOEX osVersionInfo); - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - private unsafe struct OSVERSIONINFOEX - { - /// - /// The size of this data structure, in bytes. Set this member to sizeof(OSVERSIONINFOEX). - /// - private int _dwOSVersionInfoSize; - - private readonly int _dwMajorVersion; - private readonly int _dwMinorVersion; - private readonly int _dwBuildNumber; - private readonly int _dwPlatformId; - private fixed char _szCSDVersion[128]; - private readonly short _wServicePackMajor; - private readonly short _wServicePackMinor; - private readonly ushort _wSuiteMask; - private readonly byte _wProductType; - private readonly byte _wReserved; - - /// A null-terminated string, such as "Service Pack 3", that indicates the latest Service Pack installed on the system. - /// If no Service Pack has been installed, the string is empty. - /// - public string ServicePackVersion - { - get - { - fixed (char* servicePackVersion = _szCSDVersion) - { - return new string(servicePackVersion); - } - } - } - - /// - /// The major version number of the latest Service Pack installed on the system. For example, for Service Pack 3, the - /// major version number is 3. - /// If no Service Pack has been installed, the value is zero. - /// - public short ServicePackMajor => _wServicePackMajor; - - /// - /// The minor version number of the latest Service Pack installed on the system. For example, for Service Pack 3, the - /// minor version number is 0. - /// - public short ServicePackMinor => _wServicePackMinor; - - /// - /// A bit mask that identifies the product suites available on the system. This member can be a combination of the - /// following values. - /// - public ushort SuiteMask => _wSuiteMask; - - /// - /// Any additional information about the system. - /// - public byte ProductType => _wProductType; - - /// - /// Factory for an empty OsVersionInfoEx - /// - /// OSVERSIONINFOEX - public static OSVERSIONINFOEX Create() - { - return new OSVERSIONINFOEX - { - _dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)) - }; - } - } - - private const int PRODUCT_UNDEFINED = 0x00000000; - private const int PRODUCT_ULTIMATE = 0x00000001; - private const int PRODUCT_HOME_BASIC = 0x00000002; - private const int PRODUCT_HOME_PREMIUM = 0x00000003; - private const int PRODUCT_ENTERPRISE = 0x00000004; - private const int PRODUCT_HOME_BASIC_N = 0x00000005; - private const int PRODUCT_BUSINESS = 0x00000006; - private const int PRODUCT_STANDARD_SERVER = 0x00000007; - private const int PRODUCT_DATACENTER_SERVER = 0x00000008; - private const int PRODUCT_SMALLBUSINESS_SERVER = 0x00000009; - private const int PRODUCT_ENTERPRISE_SERVER = 0x0000000A; - private const int PRODUCT_STARTER = 0x0000000B; - private const int PRODUCT_DATACENTER_SERVER_CORE = 0x0000000C; - private const int PRODUCT_STANDARD_SERVER_CORE = 0x0000000D; - private const int PRODUCT_ENTERPRISE_SERVER_CORE = 0x0000000E; - private const int PRODUCT_ENTERPRISE_SERVER_IA64 = 0x0000000F; - private const int PRODUCT_BUSINESS_N = 0x00000010; - private const int PRODUCT_WEB_SERVER = 0x00000011; - private const int PRODUCT_CLUSTER_SERVER = 0x00000012; - private const int PRODUCT_STORAGE_EXPRESS_SERVER = 0x00000014; - private const int PRODUCT_STORAGE_STANDARD_SERVER = 0x00000015; - private const int PRODUCT_STORAGE_WORKGROUP_SERVER = 0x00000016; - private const int PRODUCT_STORAGE_ENTERPRISE_SERVER = 0x00000017; - private const int PRODUCT_SERVER_FOR_SMALLBUSINESS = 0x00000018; - private const int PRODUCT_HOME_PREMIUM_N = 0x0000001A; - private const int PRODUCT_ENTERPRISE_N = 0x0000001B; - private const int PRODUCT_ULTIMATE_N = 0x0000001C; - private const int PRODUCT_WEB_SERVER_CORE = 0x0000001D; - private const int PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = 0x0000001E; - private const int PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY = 0x0000001F; - private const int PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING = 0x00000020; - private const int PRODUCT_SERVER_FOR_SMALLBUSINESS_V = 0x00000023; - private const int PRODUCT_STANDARD_SERVER_V = 0x00000024; - private const int PRODUCT_ENTERPRISE_SERVER_V = 0x00000026; - private const int PRODUCT_STANDARD_SERVER_CORE_V = 0x00000028; - private const int PRODUCT_ENTERPRISE_SERVER_CORE_V = 0x00000029; - private const int PRODUCT_HYPERV = 0x0000002A; - - private const int VER_NT_WORKSTATION = 1; - private const int VER_NT_SERVER = 3; - private const int VER_SUITE_ENTERPRISE = 2; - private const int VER_SUITE_DATACENTER = 128; - private const int VER_SUITE_PERSONAL = 512; - private const int VER_SUITE_BLADE = 1024; - /// /// Gets the service pack information of the operating system running on this computer. /// @@ -776,9 +539,9 @@ namespace Greenshot.Base.Core get { string servicePack = string.Empty; - OSVERSIONINFOEX osVersionInfo = OSVERSIONINFOEX.Create(); + OsVersionInfoEx osVersionInfo = OsVersionInfoEx.Create(); - if (GetVersionEx(ref osVersionInfo)) + if (Kernel32Api.GetVersionEx(ref osVersionInfo)) { servicePack = osVersionInfo.ServicePackVersion; } @@ -787,6 +550,7 @@ namespace Greenshot.Base.Core } } + /// /// Gets the full version string of the operating system running on this computer. /// public static string VersionString diff --git a/src/Greenshot.Base/Core/FastBitmap.cs b/src/Greenshot.Base/Core/FastBitmap.cs index 3875e6203..c0309763f 100644 --- a/src/Greenshot.Base/Core/FastBitmap.cs +++ b/src/Greenshot.Base/Core/FastBitmap.cs @@ -23,6 +23,8 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Core { @@ -84,7 +86,7 @@ namespace Greenshot.Base.Core /// /// Size of the underlying image /// - Size Size { get; } + NativeSize Size { get; } /// /// Height of the image area that this fastbitmap covers @@ -127,19 +129,19 @@ namespace Greenshot.Base.Core bool HasAlphaChannel { get; } /// - /// Draw the stored bitmap to the destionation bitmap at the supplied point + /// Draw the stored bitmap to the destination bitmap at the supplied point /// /// Graphics - /// Point with location - void DrawTo(Graphics graphics, Point destination); + /// NativePoint with location + void DrawTo(Graphics graphics, NativePoint destination); /// /// Draw the stored Bitmap on the Destination bitmap with the specified rectangle /// Be aware that the stored bitmap will be resized to the specified rectangle!! /// /// Graphics - /// Rectangle with destination - void DrawTo(Graphics graphics, Rectangle destinationRect); + /// NativeRect with destination + void DrawTo(Graphics graphics, NativeRect destinationRect); /// /// Return true if the coordinates are inside the FastBitmap @@ -214,7 +216,7 @@ namespace Greenshot.Base.Core /// public interface IFastBitmapWithClip : IFastBitmap { - Rectangle Clip { get; set; } + NativeRect Clip { get; set; } bool InvertClip { get; set; } @@ -267,14 +269,14 @@ namespace Greenshot.Base.Core public const int ColorIndexB = 2; public const int ColorIndexA = 3; - protected Rectangle Area; + protected NativeRect Area; /// /// If this is set to true, the bitmap will be disposed when disposing the IFastBitmap /// public bool NeedsDispose { get; set; } - public Rectangle Clip { get; set; } + public NativeRect Clip { get; set; } public bool InvertClip { get; set; } @@ -290,7 +292,7 @@ namespace Greenshot.Base.Core public static IFastBitmap Create(Bitmap source) { - return Create(source, Rectangle.Empty); + return Create(source, NativeRect.Empty); } public void SetResolution(float horizontal, float vertical) @@ -303,44 +305,37 @@ namespace Greenshot.Base.Core /// The supplied rectangle specifies the area for which the FastBitmap does its thing /// /// Bitmap to access - /// Rectangle which specifies the area to have access to, can be Rectangle.Empty for the whole image + /// NativeRect which specifies the area to have access to, can be NativeRect.Empty for the whole image /// IFastBitmap - public static IFastBitmap Create(Bitmap source, Rectangle area) - { - switch (source.PixelFormat) + public static IFastBitmap Create(Bitmap source, NativeRect area) => + source.PixelFormat switch { - case PixelFormat.Format8bppIndexed: - return new FastChunkyBitmap(source, area); - case PixelFormat.Format24bppRgb: - return new Fast24RgbBitmap(source, area); - case PixelFormat.Format32bppRgb: - return new Fast32RgbBitmap(source, area); - case PixelFormat.Format32bppArgb: - case PixelFormat.Format32bppPArgb: - return new Fast32ArgbBitmap(source, area); - default: - throw new NotSupportedException($"Not supported Pixelformat {source.PixelFormat}"); - } - } + PixelFormat.Format8bppIndexed => new FastChunkyBitmap(source, area), + PixelFormat.Format24bppRgb => new Fast24RgbBitmap(source, area), + PixelFormat.Format32bppRgb => new Fast32RgbBitmap(source, area), + PixelFormat.Format32bppArgb => new Fast32ArgbBitmap(source, area), + PixelFormat.Format32bppPArgb => new Fast32ArgbBitmap(source, area), + _ => throw new NotSupportedException($"Not supported PixelFormat {source.PixelFormat}") + }; /// /// Factory for creating a FastBitmap as a destination for the source /// /// Bitmap to clone - /// new Pixelformat + /// new PixelFormat /// IFastBitmap public static IFastBitmap CreateCloneOf(Image source, PixelFormat pixelFormat) { - return CreateCloneOf(source, pixelFormat, Rectangle.Empty); + return CreateCloneOf(source, pixelFormat, NativeRect.Empty); } /// /// Factory for creating a FastBitmap as a destination for the source /// /// Bitmap to clone - /// Area of the bitmap to access, can be Rectangle.Empty for the whole + /// Area of the bitmap to access, can be NativeRect.Empty for the whole /// IFastBitmap - public static IFastBitmap CreateCloneOf(Image source, Rectangle area) + public static IFastBitmap CreateCloneOf(Image source, NativeRect area) { return CreateCloneOf(source, PixelFormat.DontCare, area); } @@ -350,9 +345,9 @@ namespace Greenshot.Base.Core /// /// Bitmap to clone /// Pixelformat of the cloned bitmap - /// Area of the bitmap to access, can be Rectangle.Empty for the whole + /// Area of the bitmap to access, can be NativeRect.Empty for the whole /// IFastBitmap - public static IFastBitmap CreateCloneOf(Image source, PixelFormat pixelFormat, Rectangle area) + public static IFastBitmap CreateCloneOf(Image source, PixelFormat pixelFormat, NativeRect area) { Bitmap destination = ImageHelper.CloneArea(source, area, pixelFormat); FastBitmap fastBitmap = Create(destination) as FastBitmap; @@ -369,11 +364,11 @@ namespace Greenshot.Base.Core /// /// Factory for creating a FastBitmap as a destination /// - /// - /// - /// + /// NativeSize + /// PixelFormat + /// Color /// IFastBitmap - public static IFastBitmap CreateEmpty(Size newSize, PixelFormat pixelFormat, Color backgroundColor) + public static IFastBitmap CreateEmpty(NativeSize newSize, PixelFormat pixelFormat, Color backgroundColor) { Bitmap destination = ImageHelper.CreateEmpty(newSize.Width, newSize.Height, pixelFormat, backgroundColor, 96f, 96f); IFastBitmap fastBitmap = Create(destination); @@ -385,14 +380,14 @@ namespace Greenshot.Base.Core /// Constructor which stores the image and locks it when called /// /// Bitmap - /// Rectangle - protected FastBitmap(Bitmap bitmap, Rectangle area) + /// NativeRect + protected FastBitmap(Bitmap bitmap, NativeRect area) { Bitmap = bitmap; - Rectangle bitmapArea = new Rectangle(Point.Empty, bitmap.Size); - if (area != Rectangle.Empty) + var bitmapArea = new NativeRect(NativePoint.Empty, bitmap.Size); + if (area != NativeRect.Empty) { - area.Intersect(bitmapArea); + area = area.Intersect(bitmapArea); Area = area; } else @@ -413,11 +408,11 @@ namespace Greenshot.Base.Core /// /// Return the size of the image /// - public Size Size + public NativeSize Size { get { - if (Area == Rectangle.Empty) + if (Area == NativeRect.Empty) { return Bitmap.Size; } @@ -433,7 +428,7 @@ namespace Greenshot.Base.Core { get { - if (Area == Rectangle.Empty) + if (Area == NativeRect.Empty) { return Bitmap.Width; } @@ -449,7 +444,7 @@ namespace Greenshot.Base.Core { get { - if (Area == Rectangle.Empty) + if (Area == NativeRect.Empty) { return Bitmap.Height; } @@ -596,13 +591,13 @@ namespace Greenshot.Base.Core } /// - /// Draw the stored bitmap to the destionation bitmap at the supplied point + /// Draw the stored bitmap to the destination bitmap at the supplied point /// /// /// - public void DrawTo(Graphics graphics, Point destination) + public void DrawTo(Graphics graphics, NativePoint destination) { - DrawTo(graphics, new Rectangle(destination, Area.Size)); + DrawTo(graphics, new NativeRect(destination, Area.Size)); } /// @@ -610,8 +605,8 @@ namespace Greenshot.Base.Core /// Be aware that the stored bitmap will be resized to the specified rectangle!! /// /// - /// - public void DrawTo(Graphics graphics, Rectangle destinationRect) + /// NativeRect + public void DrawTo(Graphics graphics, NativeRect destinationRect) { // Make sure this.bitmap is unlocked, if it was locked bool isLocked = BitsLocked; @@ -715,7 +710,7 @@ namespace Greenshot.Base.Core } /// - /// This is the implementation of the FastBitmat for the 8BPP pixelformat + /// This is the implementation of the FastBitmap for the 8BPP pixelformat /// public unsafe class FastChunkyBitmap : FastBitmap { @@ -723,7 +718,7 @@ namespace Greenshot.Base.Core private readonly Color[] _colorEntries; private readonly Dictionary _colorCache = new Dictionary(); - public FastChunkyBitmap(Bitmap source, Rectangle area) : base(source, area) + public FastChunkyBitmap(Bitmap source, NativeRect area) : base(source, area) { _colorEntries = Bitmap.Palette.Entries; } @@ -825,7 +820,7 @@ namespace Greenshot.Base.Core /// public unsafe class Fast24RgbBitmap : FastBitmap { - public Fast24RgbBitmap(Bitmap source, Rectangle area) : base(source, area) + public Fast24RgbBitmap(Bitmap source, NativeRect area) : base(source, area) { } @@ -891,7 +886,7 @@ namespace Greenshot.Base.Core /// public unsafe class Fast32RgbBitmap : FastBitmap { - public Fast32RgbBitmap(Bitmap source, Rectangle area) : base(source, area) + public Fast32RgbBitmap(Bitmap source, NativeRect area) : base(source, area) { } @@ -961,7 +956,7 @@ namespace Greenshot.Base.Core public Color BackgroundBlendColor { get; set; } - public Fast32ArgbBitmap(Bitmap source, Rectangle area) : base(source, area) + public Fast32ArgbBitmap(Bitmap source, NativeRect area) : base(source, area) { BackgroundBlendColor = Color.White; } diff --git a/src/Greenshot.Base/Core/FileDescriptor.cs b/src/Greenshot.Base/Core/FileDescriptor.cs index 5306cf3b8..750cbab4d 100644 --- a/src/Greenshot.Base/Core/FileDescriptor.cs +++ b/src/Greenshot.Base/Core/FileDescriptor.cs @@ -22,7 +22,7 @@ using System; using System.IO; using System.Text; -using Greenshot.Base.UnmanagedHelpers.Structs; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Core { @@ -30,8 +30,8 @@ namespace Greenshot.Base.Core { public FileDescriptorFlags Flags { get; set; } public Guid ClassId { get; set; } - public SIZE Size { get; set; } - public POINT Point { get; set; } + public NativeSize Size { get; set; } + public NativePoint Point { get; set; } public FileAttributes FileAttributes { get; set; } public DateTime CreationTime { get; set; } public DateTime LastAccessTime { get; set; } @@ -46,9 +46,9 @@ namespace Greenshot.Base.Core //ClassID ClassId = new Guid(reader.ReadBytes(16)); //Size - Size = new SIZE(reader.ReadInt32(), reader.ReadInt32()); + Size = new NativeSize(reader.ReadInt32(), reader.ReadInt32()); //Point - Point = new POINT(reader.ReadInt32(), reader.ReadInt32()); + Point = new NativePoint(reader.ReadInt32(), reader.ReadInt32()); //FileAttributes FileAttributes = (FileAttributes)reader.ReadUInt32(); //CreationTime diff --git a/src/Greenshot.Base/Core/FileFormatHandlers/FileFormatHandlerExtensions.cs b/src/Greenshot.Base/Core/FileFormatHandlers/FileFormatHandlerExtensions.cs new file mode 100644 index 000000000..8941c7184 --- /dev/null +++ b/src/Greenshot.Base/Core/FileFormatHandlers/FileFormatHandlerExtensions.cs @@ -0,0 +1,163 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Base.Interfaces.Plugin; + +namespace Greenshot.Base.Core.FileFormatHandlers +{ + /// + /// This is the registry where all IFileFormatHandler are registered and can be used + /// + public static class FileFormatHandlerExtensions + { + /// + /// Make sure we handle the input extension always the same, by "normalizing" it + /// + /// string + /// string + public static string NormalizeExtension(string extension) + { + if (string.IsNullOrEmpty(extension)) + { + return null; + } + + extension = extension.ToLowerInvariant(); + return !extension.StartsWith(".") ? $".{extension}" : extension; + } + + /// + /// Return the extensions that the provided IFileFormatHandlers can accept for the specified action + /// + /// IEnumerable{IFileFormatHandler} + /// + /// + public static IEnumerable ExtensionsFor(this IEnumerable fileFormatHandlers, FileFormatHandlerActions fileFormatHandlerAction) + { + return fileFormatHandlers.Where(ffh => ffh.SupportedExtensions.ContainsKey(fileFormatHandlerAction)).SelectMany(ffh => ffh.SupportedExtensions[fileFormatHandlerAction]).Distinct().OrderBy(e => e); + } + + /// + /// Extension method to check if a certain IFileFormatHandler supports a certain action with a specific extension + /// + /// IFileFormatHandler + /// FileFormatHandlerActions + /// string + /// bool + public static bool Supports(this IFileFormatHandler fileFormatHandler, FileFormatHandlerActions fileFormatHandlerAction, string extension) + { + extension = NormalizeExtension(extension); + return fileFormatHandler.SupportedExtensions.ContainsKey(fileFormatHandlerAction) && fileFormatHandler.SupportedExtensions[fileFormatHandlerAction].Contains(extension); + } + + /// + /// This wrapper method for TrySaveToStream will do: + /// Find all the IFileFormatHandler which support the action for the supplied extension. + /// Take the first, to call the TrySaveToStream on. + /// + /// IEnumerable{IFileFormatHandler} + /// Bitmap + /// Stream + /// string + /// ISurface + /// bool + public static bool TrySaveToStream(this IEnumerable fileFormatHandlers, Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + extension = NormalizeExtension(extension); + + var saveFileFormatHandlers = fileFormatHandlers + .Where(ffh => ffh.Supports(FileFormatHandlerActions.LoadFromStream, extension)) + .OrderBy(ffh => ffh.PriorityFor(FileFormatHandlerActions.LoadFromStream, extension)).ToList(); + + if (!saveFileFormatHandlers.Any()) + { + return false; + } + + foreach (var fileFormatHandler in saveFileFormatHandlers) + { + if (fileFormatHandler.TrySaveToStream(bitmap, destination, extension, surface)) + { + return true; + } + } + + return false; + } + + /// + /// Try to load a drawable container from the stream + /// + /// IEnumerable{IFileFormatHandler} + /// Stream + /// string + /// ISurface + /// IEnumerable{IDrawableContainer} + public static IEnumerable LoadDrawablesFromStream(this IEnumerable fileFormatHandlers, Stream stream, string extension, ISurface parentSurface = null) + { + extension = NormalizeExtension(extension); + + var loadfileFormatHandler = fileFormatHandlers + .Where(ffh => ffh.Supports(FileFormatHandlerActions.LoadDrawableFromStream, extension)) + .OrderBy(ffh => ffh.PriorityFor(FileFormatHandlerActions.LoadDrawableFromStream, extension)) + .FirstOrDefault(); + + if (loadfileFormatHandler != null) + { + return loadfileFormatHandler.LoadDrawablesFromStream(stream, extension, parentSurface); + } + + return Enumerable.Empty(); + } + + /// + /// Try to load a Bitmap from the stream + /// + /// IEnumerable{IFileFormatHandler} + /// Stream + /// string + /// Bitmap out + /// bool true if it was successful + public static bool TryLoadFromStream(this IEnumerable fileFormatHandlers, Stream stream, string extension, out Bitmap bitmap) + { + extension = NormalizeExtension(extension); + + var loadFileFormatHandler = fileFormatHandlers + .Where(ffh => ffh.Supports(FileFormatHandlerActions.LoadFromStream, extension)) + .OrderBy(ffh => ffh.PriorityFor(FileFormatHandlerActions.LoadFromStream, extension)) + .FirstOrDefault(); + + if (loadFileFormatHandler == null) + { + bitmap = null; + return false; + } + + return loadFileFormatHandler.TryLoadFromStream(stream, extension, out bitmap); + } + } +} diff --git a/src/Greenshot.Base/Core/HResultExtensions.cs b/src/Greenshot.Base/Core/HResultExtensions.cs deleted file mode 100644 index c3300e80f..000000000 --- a/src/Greenshot.Base/Core/HResultExtensions.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Greenshot - a free and open source screenshot tool -// Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom -// -// For more information see: https://getgreenshot.org/ -// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 1 of the License, or -// (at your option) any later version. -// -// 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System.Diagnostics.Contracts; -using Greenshot.Base.Core.Enums; - -namespace Greenshot.Base.Core -{ - /// - /// Extensions to handle the HResult - /// - public static class HResultExtensions - { - /// - /// Test if the HResult represents a fail - /// - /// HResult - /// bool - [Pure] - public static bool Failed(this HResult hResult) - { - return hResult < 0; - } - - /// - /// Test if the HResult represents a success - /// - /// HResult - /// bool - [Pure] - public static bool Succeeded(this HResult hResult) - { - return hResult >= HResult.S_OK; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/IImage.cs b/src/Greenshot.Base/Core/IImage.cs index d6b30c667..20aa320d9 100644 --- a/src/Greenshot.Base/Core/IImage.cs +++ b/src/Greenshot.Base/Core/IImage.cs @@ -61,7 +61,7 @@ namespace Greenshot.Base.Core float HorizontalResolution { get; } /// - /// Unterlying image, or an on demand rendered version with different attributes as the original + /// Underlying image, or an on demand rendered version with different attributes as the original /// Image Image { get; } } diff --git a/src/Greenshot.Base/Core/ImageHelper.cs b/src/Greenshot.Base/Core/ImageHelper.cs index 60d846eac..f75cc9def 100644 --- a/src/Greenshot.Base/Core/ImageHelper.cs +++ b/src/Greenshot.Base/Core/ImageHelper.cs @@ -24,28 +24,24 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; -using System.IO; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32; +using Greenshot.Base.Core.Enums; using Greenshot.Base.Effects; using Greenshot.Base.IniFile; -using Greenshot.Base.Interfaces; -using Greenshot.Base.UnmanagedHelpers; using log4net; +using Brush = System.Drawing.Brush; +using Color = System.Drawing.Color; +using Matrix = System.Drawing.Drawing2D.Matrix; +using Pen = System.Drawing.Pen; +using PixelFormat = System.Drawing.Imaging.PixelFormat; namespace Greenshot.Base.Core { - internal enum ExifOrientations : byte - { - Unknown = 0, - TopLeft = 1, - TopRight = 2, - BottomRight = 3, - BottomLeft = 4, - LeftTop = 5, - RightTop = 6, - RightBottom = 7, - LeftBottom = 8, - } - /// /// Description of ImageHelper. /// @@ -55,83 +51,6 @@ namespace Greenshot.Base.Core private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private const int ExifOrientationId = 0x0112; - static ImageHelper() - { - StreamConverters["greenshot"] = (stream, s) => - { - var surface = SimpleServiceProvider.Current.GetInstance>().Invoke(); - return surface.GetImageForExport(); - }; - - // Add a SVG converter - StreamConverters["svg"] = (stream, s) => - { - stream.Position = 0; - try - { - return SvgImage.FromStream(stream).Image; - } - catch (Exception ex) - { - Log.Error("Can't load SVG", ex); - } - - return null; - }; - - static Image DefaultConverter(Stream stream, string s) - { - stream.Position = 0; - using var tmpImage = Image.FromStream(stream, true, true); - Log.DebugFormat("Loaded bitmap with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); - return Clone(tmpImage, PixelFormat.Format32bppArgb); - } - - // Fallback - StreamConverters[string.Empty] = DefaultConverter; - StreamConverters["gif"] = DefaultConverter; - StreamConverters["bmp"] = DefaultConverter; - StreamConverters["jpg"] = DefaultConverter; - StreamConverters["jpeg"] = DefaultConverter; - StreamConverters["png"] = DefaultConverter; - StreamConverters["wmf"] = DefaultConverter; - - StreamConverters["ico"] = (stream, extension) => - { - // Icon logic, try to get the Vista icon, else the biggest possible - try - { - using Image tmpImage = ExtractVistaIcon(stream); - if (tmpImage != null) - { - return Clone(tmpImage, PixelFormat.Format32bppArgb); - } - } - catch (Exception vistaIconException) - { - Log.Warn("Can't read icon", vistaIconException); - } - - try - { - // No vista icon, try normal icon - stream.Position = 0; - // We create a copy of the bitmap, so everything else can be disposed - using Icon tmpIcon = new Icon(stream, new Size(1024, 1024)); - using Image tmpImage = tmpIcon.ToBitmap(); - return Clone(tmpImage, PixelFormat.Format32bppArgb); - } - catch (Exception iconException) - { - Log.Warn("Can't read icon", iconException); - } - - stream.Position = 0; - return DefaultConverter(stream, extension); - }; - } - - public static IDictionary> StreamConverters { get; } = new Dictionary>(); /// /// Make sure the image is orientated correctly @@ -238,7 +157,7 @@ namespace Greenshot.Base.Core graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - Rectangle rectDestination = new Rectangle(0, 0, thumbWidth, thumbHeight); + NativeRect rectDestination = new NativeRect(0, 0, thumbWidth, thumbHeight); graphics.DrawImage(image, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel); } @@ -246,18 +165,18 @@ namespace Greenshot.Base.Core } /// - /// Crops the image to the specified rectangle + /// Crops the image to the specified NativeRect /// /// Image to crop - /// Rectangle with bitmap coordinates, will be "intersected" to the bitmap - public static bool Crop(ref Image image, ref Rectangle cropRectangle) + /// NativeRect with bitmap coordinates, will be "intersected" to the bitmap + public static bool Crop(ref Image image, ref NativeRect cropNativeRect) { if (image is Bitmap && (image.Width * image.Height > 0)) { - cropRectangle.Intersect(new Rectangle(0, 0, image.Width, image.Height)); - if (cropRectangle.Width != 0 || cropRectangle.Height != 0) + cropNativeRect = cropNativeRect.Intersect(new NativeRect(0, 0, image.Width, image.Height)); + if (cropNativeRect.Width != 0 || cropNativeRect.Height != 0) { - Image returnImage = CloneArea(image, cropRectangle, PixelFormat.DontCare); + Image returnImage = CloneArea(image, cropNativeRect, PixelFormat.DontCare); image.Dispose(); image = returnImage; return true; @@ -269,24 +188,26 @@ namespace Greenshot.Base.Core } /// - /// Private helper method for the FindAutoCropRectangle + /// Private helper method for the FindAutoCropNativeRect /// - /// - /// - /// - /// Rectangle - private static Rectangle FindAutoCropRectangle(IFastBitmap fastBitmap, Point colorPoint, int cropDifference) + /// IFastBitmap + /// NativePoint + /// int + /// NativeRect with optional area to scan in + /// NativeRect + private static NativeRect FindAutoCropNativeRect(IFastBitmap fastBitmap, NativePoint colorPoint, int cropDifference, NativeRect? area = null) { - Rectangle cropRectangle = Rectangle.Empty; + area ??= new NativeRect(0, 0, fastBitmap.Width, fastBitmap.Height); + NativeRect cropNativeRect = NativeRect.Empty; Color referenceColor = fastBitmap.GetColorAt(colorPoint.X, colorPoint.Y); - Point min = new Point(int.MaxValue, int.MaxValue); - Point max = new Point(int.MinValue, int.MinValue); + NativePoint min = new NativePoint(int.MaxValue, int.MaxValue); + NativePoint max = new NativePoint(int.MinValue, int.MinValue); if (cropDifference > 0) { - for (int y = 0; y < fastBitmap.Height; y++) + for (int y = area.Value.Top; y < area.Value.Bottom; y++) { - for (int x = 0; x < fastBitmap.Width; x++) + for (int x = area.Value.Left; x < area.Value.Right; x++) { Color currentColor = fastBitmap.GetColorAt(x, y); int diffR = Math.Abs(currentColor.R - referenceColor.R); @@ -297,18 +218,18 @@ namespace Greenshot.Base.Core continue; } - if (x < min.X) min.X = x; - if (y < min.Y) min.Y = y; - if (x > max.X) max.X = x; - if (y > max.Y) max.Y = y; + if (x < min.X) min = min.ChangeX(x); + if (y < min.Y) min = min.ChangeY(y); + if (x > max.X) max = max.ChangeX(x); + if (y > max.Y) max = max.ChangeY(y); } } } else { - for (int y = 0; y < fastBitmap.Height; y++) + for (int y = area.Value.Top; y < area.Value.Bottom; y++) { - for (int x = 0; x < fastBitmap.Width; x++) + for (int x = area.Value.Left; x < area.Value.Right; x++) { Color currentColor = fastBitmap.GetColorAt(x, y); if (!referenceColor.Equals(currentColor)) @@ -316,41 +237,44 @@ namespace Greenshot.Base.Core continue; } - if (x < min.X) min.X = x; - if (y < min.Y) min.Y = y; - if (x > max.X) max.X = x; - if (y > max.Y) max.Y = y; + if (x < min.X) min = min.ChangeX(x); + if (y < min.Y) min = min.ChangeY(y); + if (x > max.X) max = max.ChangeX(x); + if (y > max.Y) max = max.ChangeY(y); } } } - if (!(Point.Empty.Equals(min) && max.Equals(new Point(fastBitmap.Width - 1, fastBitmap.Height - 1)))) + if (!(NativePoint.Empty.Equals(min) && max.Equals(new NativePoint(area.Value.Width - 1, area.Value.Height - 1)))) { if (!(min.X == int.MaxValue || min.Y == int.MaxValue || max.X == int.MinValue || min.X == int.MinValue)) { - cropRectangle = new Rectangle(min.X, min.Y, max.X - min.X + 1, max.Y - min.Y + 1); + cropNativeRect = new NativeRect(min.X, min.Y, max.X - min.X + 1, max.Y - min.Y + 1); } } - return cropRectangle; + return cropNativeRect; } /// - /// Get a rectangle for the image which crops the image of all colors equal to that on 0,0 + /// Get a NativeRect for the image which crops the image of all colors equal to that on 0,0 /// - /// - /// - /// Rectangle - public static Rectangle FindAutoCropRectangle(Image image, int cropDifference) + /// Image + /// int + /// NativeRect with optional area + /// NativeRect + public static NativeRect FindAutoCropRectangle(Image image, int cropDifference, NativeRect? area = null) { - Rectangle cropRectangle = Rectangle.Empty; - var checkPoints = new List + area ??= new NativeRect(0, 0, image.Width, image.Height); + NativeRect cropNativeRect = NativeRect.Empty; + var checkPoints = new List { - new Point(0, 0), - new Point(0, image.Height - 1), - new Point(image.Width - 1, 0), - new Point(image.Width - 1, image.Height - 1) + new(area.Value.Left, area.Value.Top), + new(area.Value.Left, area.Value.Bottom - 1), + new(area.Value.Right - 1, area.Value.Top), + new(area.Value.Right - 1, area.Value.Bottom - 1) }; + // Top Left // Bottom Left // Top Right @@ -358,138 +282,17 @@ namespace Greenshot.Base.Core using (IFastBitmap fastBitmap = FastBitmap.Create((Bitmap) image)) { // find biggest area - foreach (Point checkPoint in checkPoints) + foreach (var checkPoint in checkPoints) { - var currentRectangle = FindAutoCropRectangle(fastBitmap, checkPoint, cropDifference); - if (currentRectangle.Width * currentRectangle.Height > cropRectangle.Width * cropRectangle.Height) + var currentNativeRect = FindAutoCropNativeRect(fastBitmap, checkPoint, cropDifference, area); + if (currentNativeRect.Width * currentNativeRect.Height > cropNativeRect.Width * cropNativeRect.Height) { - cropRectangle = currentRectangle; + cropNativeRect = currentNativeRect; } } } - return cropRectangle; - } - - /// - /// Load an image from file - /// - /// - /// - public static Image LoadImage(string filename) - { - if (string.IsNullOrEmpty(filename)) - { - return null; - } - - if (!File.Exists(filename)) - { - return null; - } - - Image fileImage; - Log.InfoFormat("Loading image from file {0}", filename); - // Fixed lock problem Bug #3431881 - using (Stream imageFileStream = File.OpenRead(filename)) - { - fileImage = FromStream(imageFileStream, Path.GetExtension(filename)); - } - - if (fileImage != null) - { - Log.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", filename, fileImage.Width, fileImage.Height, fileImage.PixelFormat, - fileImage.HorizontalResolution, fileImage.VerticalResolution); - } - - return fileImage; - } - - /// - /// Based on: https://www.codeproject.com/KB/cs/IconExtractor.aspx - /// And a hint from: https://www.codeproject.com/KB/cs/IconLib.aspx - /// - /// Stream with the icon information - /// Bitmap with the Vista Icon (256x256) - private static Bitmap ExtractVistaIcon(Stream iconStream) - { - const int sizeIconDir = 6; - const int sizeIconDirEntry = 16; - Bitmap bmpPngExtracted = null; - try - { - byte[] srcBuf = new byte[iconStream.Length]; - iconStream.Read(srcBuf, 0, (int) iconStream.Length); - int iCount = BitConverter.ToInt16(srcBuf, 4); - for (int iIndex = 0; iIndex < iCount; iIndex++) - { - int iWidth = srcBuf[sizeIconDir + sizeIconDirEntry * iIndex]; - int iHeight = srcBuf[sizeIconDir + sizeIconDirEntry * iIndex + 1]; - if (iWidth == 0 && iHeight == 0) - { - int iImageSize = BitConverter.ToInt32(srcBuf, sizeIconDir + sizeIconDirEntry * iIndex + 8); - int iImageOffset = BitConverter.ToInt32(srcBuf, sizeIconDir + sizeIconDirEntry * iIndex + 12); - using MemoryStream destStream = new MemoryStream(); - destStream.Write(srcBuf, iImageOffset, iImageSize); - destStream.Seek(0, SeekOrigin.Begin); - bmpPngExtracted = new Bitmap(destStream); // This is PNG! :) - break; - } - } - } - catch - { - return null; - } - - return bmpPngExtracted; - } - - /// - /// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648069%28v=vs.85%29.aspx - /// - /// The file (EXE or DLL) to get the icon from - /// Index of the icon - /// true if the large icon is wanted - /// Icon - public static Icon ExtractAssociatedIcon(string location, int index, bool takeLarge) - { - Shell32.ExtractIconEx(location, index, out var large, out var small, 1); - Icon returnIcon = null; - bool isLarge = false; - bool isSmall = false; - try - { - if (takeLarge && !IntPtr.Zero.Equals(large)) - { - returnIcon = Icon.FromHandle(large); - isLarge = true; - } - else if (!IntPtr.Zero.Equals(small)) - { - returnIcon = Icon.FromHandle(small); - isSmall = true; - } - else if (!IntPtr.Zero.Equals(large)) - { - returnIcon = Icon.FromHandle(large); - isLarge = true; - } - } - finally - { - if (isLarge && !IntPtr.Zero.Equals(small)) - { - User32.DestroyIcon(small); - } - - if (isSmall && !IntPtr.Zero.Equals(large)) - { - User32.DestroyIcon(large); - } - } - - return returnIcon; + return cropNativeRect; } /// @@ -497,7 +300,7 @@ namespace Greenshot.Base.Core /// /// Bitmap /// IEffect - /// + /// Matrix /// Bitmap public static Image ApplyEffect(Image sourceImage, IEffect effect, Matrix matrix) { @@ -543,7 +346,7 @@ namespace Greenshot.Base.Core /// /// Path to draw to /// Points for the lines to draw - private static void DrawLines(GraphicsPath path, List points) + private static void DrawLines(GraphicsPath path, List points) { path.AddLine(points[0], points[1]); for (int i = 0; i < points.Count - 1; i++) @@ -563,20 +366,19 @@ namespace Greenshot.Base.Core /// Changed bitmap public static Image CreateTornEdge(Image sourceImage, int toothHeight, int horizontalToothRange, int verticalToothRange, bool[] edges) { - Image returnImage = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format32bppArgb, Color.Empty, sourceImage.HorizontalResolution, - sourceImage.VerticalResolution); + Image returnImage = CreateEmpty(sourceImage.Width, sourceImage.Height, PixelFormat.Format32bppArgb, Color.Empty, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); using (var path = new GraphicsPath()) { Random random = new Random(); int horizontalRegions = (int) Math.Round((float) sourceImage.Width / horizontalToothRange); int verticalRegions = (int) Math.Round((float) sourceImage.Height / verticalToothRange); - Point topLeft = new Point(0, 0); - Point topRight = new Point(sourceImage.Width, 0); - Point bottomLeft = new Point(0, sourceImage.Height); - Point bottomRight = new Point(sourceImage.Width, sourceImage.Height); + var topLeft = new NativePoint(0, 0); + var topRight = new NativePoint(sourceImage.Width, 0); + var bottomLeft = new NativePoint(0, sourceImage.Height); + var bottomRight = new NativePoint(sourceImage.Width, sourceImage.Height); - List points = new List(); + var points = new List(); if (edges[0]) { @@ -587,15 +389,15 @@ namespace Greenshot.Base.Core } else { - points.Add(new Point(random.Next(1, toothHeight), random.Next(1, toothHeight))); + points.Add(new NativePoint(random.Next(1, toothHeight), random.Next(1, toothHeight))); } for (int i = 1; i < horizontalRegions - 1; i++) { - points.Add(new Point(i * horizontalToothRange, random.Next(1, toothHeight))); + points.Add(new NativePoint(i * horizontalToothRange, random.Next(1, toothHeight))); } - points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), random.Next(1, toothHeight))); + points.Add(new NativePoint(sourceImage.Width - random.Next(1, toothHeight), random.Next(1, toothHeight))); } else { @@ -609,10 +411,10 @@ namespace Greenshot.Base.Core { for (int i = 1; i < verticalRegions - 1; i++) { - points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), i * verticalToothRange)); + points.Add(new NativePoint(sourceImage.Width - random.Next(1, toothHeight), i * verticalToothRange)); } - points.Add(new Point(sourceImage.Width - random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); + points.Add(new NativePoint(sourceImage.Width - random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); } else { @@ -627,10 +429,10 @@ namespace Greenshot.Base.Core { for (int i = 1; i < horizontalRegions - 1; i++) { - points.Add(new Point(sourceImage.Width - i * horizontalToothRange, sourceImage.Height - random.Next(1, toothHeight))); + points.Add(new NativePoint(sourceImage.Width - i * horizontalToothRange, sourceImage.Height - random.Next(1, toothHeight))); } - points.Add(new Point(random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); + points.Add(new NativePoint(random.Next(1, toothHeight), sourceImage.Height - random.Next(1, toothHeight))); } else { @@ -646,7 +448,7 @@ namespace Greenshot.Base.Core // One fewer as the end point is the starting point for (int i = 1; i < verticalRegions - 1; i++) { - points.Add(new Point(random.Next(1, toothHeight), points[points.Count - 1].Y - verticalToothRange)); + points.Add(new NativePoint(random.Next(1, toothHeight), points[points.Count - 1].Y - verticalToothRange)); } } else @@ -967,19 +769,18 @@ namespace Greenshot.Base.Core /// /// /// - /// - public static Rectangle CreateIntersectRectangle(Size applySize, Rectangle rect, bool invert) + /// NativeRect + public static NativeRect CreateIntersectRectangle(NativeSize applySize, NativeRect rect, bool invert) { - Rectangle myRect; + NativeRect myRect; if (invert) { - myRect = new Rectangle(0, 0, applySize.Width, applySize.Height); + myRect = new NativeRect(0, 0, applySize.Width, applySize.Height); } else { - Rectangle applyRect = new Rectangle(0, 0, applySize.Width, applySize.Height); - myRect = new Rectangle(rect.X, rect.Y, rect.Width, rect.Height); - myRect.Intersect(applyRect); + NativeRect applyRect = new NativeRect(0, 0, applySize.Width, applySize.Height); + myRect = new NativeRect(rect.X, rect.Y, rect.Width, rect.Height).Intersect(applyRect); } return myRect; @@ -995,11 +796,9 @@ namespace Greenshot.Base.Core /// /// The transform matrix which describes how the elements need to be transformed to stay at the same location /// Bitmap with the shadow, is bigger than the sourceBitmap!! - public static Bitmap CreateShadow(Image sourceBitmap, float darkness, int shadowSize, Point shadowOffset, Matrix matrix, PixelFormat targetPixelformat) + public static Bitmap CreateShadow(Image sourceBitmap, float darkness, int shadowSize, NativePoint shadowOffset, Matrix matrix, PixelFormat targetPixelformat) { - Point offset = shadowOffset; - offset.X += shadowSize - 1; - offset.Y += shadowSize - 1; + NativePoint offset = shadowOffset.Offset(shadowSize - 1, shadowSize - 1); matrix.Translate(offset.X, offset.Y, MatrixOrder.Append); // Create a new "clean" image Bitmap returnImage = CreateEmpty(sourceBitmap.Width + shadowSize * 2, sourceBitmap.Height + shadowSize * 2, targetPixelformat, Color.Empty, @@ -1010,7 +809,7 @@ namespace Greenshot.Base.Core shadowSize++; } - bool useGdiBlur = GDIplus.IsBlurPossible(shadowSize); + bool useGdiBlur = GdiPlusApi.IsBlurPossible(shadowSize); // Create "mask" for the shadow ColorMatrix maskMatrix = new ColorMatrix { @@ -1027,20 +826,20 @@ namespace Greenshot.Base.Core maskMatrix.Matrix33 = darkness; } - Rectangle shadowRectangle = new Rectangle(new Point(shadowSize, shadowSize), sourceBitmap.Size); - ApplyColorMatrix((Bitmap) sourceBitmap, Rectangle.Empty, returnImage, shadowRectangle, maskMatrix); + NativeRect shadowNativeRect = new NativeRect(new NativePoint(shadowSize, shadowSize), sourceBitmap.Size); + ApplyColorMatrix((Bitmap) sourceBitmap, NativeRect.Empty, returnImage, shadowNativeRect, maskMatrix); // blur "shadow", apply to whole new image if (useGdiBlur) { // Use GDI Blur - Rectangle newImageRectangle = new Rectangle(0, 0, returnImage.Width, returnImage.Height); - GDIplus.ApplyBlur(returnImage, newImageRectangle, shadowSize + 1, false); + NativeRect newImageNativeRect = new NativeRect(0, 0, returnImage.Width, returnImage.Height); + GdiPlusApi.ApplyBlur(returnImage, newImageNativeRect, shadowSize + 1, false); } else { // try normal software blur - //returnImage = CreateBlur(returnImage, newImageRectangle, true, shadowSize, 1d, false, newImageRectangle); + //returnImage = CreateBlur(returnImage, newImageNativeRect, true, shadowSize, 1d, false, newImageNativeRect); ApplyBoxBlur(returnImage, shadowSize); } @@ -1104,18 +903,18 @@ namespace Greenshot.Base.Core /// ColorMatrix to apply public static void ApplyColorMatrix(Bitmap source, ColorMatrix colorMatrix) { - ApplyColorMatrix(source, Rectangle.Empty, source, Rectangle.Empty, colorMatrix); + ApplyColorMatrix(source, NativeRect.Empty, source, NativeRect.Empty, colorMatrix); } /// /// Apply a color matrix by copying from the source to the destination /// /// Image to copy from - /// Rectangle to copy from - /// Rectangle to copy to + /// NativeRect to copy from + /// NativeRect to copy to /// Image to copy to /// ColorMatrix to apply - public static void ApplyColorMatrix(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ColorMatrix colorMatrix) + public static void ApplyColorMatrix(Bitmap source, NativeRect sourceRect, Bitmap dest, NativeRect destRect, ColorMatrix colorMatrix) { using ImageAttributes imageAttributes = new ImageAttributes(); imageAttributes.ClearColorMatrix(); @@ -1127,15 +926,15 @@ namespace Greenshot.Base.Core /// Apply a color matrix by copying from the source to the destination /// /// Image to copy from - /// Rectangle to copy from - /// Rectangle to copy to + /// NativeRect to copy from + /// NativeRect to copy to /// Image to copy to /// ImageAttributes to apply - public static void ApplyImageAttributes(Bitmap source, Rectangle sourceRect, Bitmap dest, Rectangle destRect, ImageAttributes imageAttributes) + public static void ApplyImageAttributes(Bitmap source, NativeRect sourceRect, Bitmap dest, NativeRect destRect, ImageAttributes imageAttributes) { - if (sourceRect == Rectangle.Empty) + if (sourceRect == NativeRect.Empty) { - sourceRect = new Rectangle(0, 0, source.Width, source.Height); + sourceRect = new NativeRect(0, 0, source.Width, source.Height); } if (dest == null) @@ -1143,9 +942,9 @@ namespace Greenshot.Base.Core dest = source; } - if (destRect == Rectangle.Empty) + if (destRect == NativeRect.Empty) { - destRect = new Rectangle(0, 0, dest.Width, dest.Height); + destRect = new NativeRect(0, 0, dest.Width, dest.Height); } using Graphics graphics = Graphics.FromImage(dest); @@ -1194,7 +993,7 @@ namespace Greenshot.Base.Core public static Image CreateBorder(Image sourceImage, int borderSize, Color borderColor, PixelFormat targetPixelformat, Matrix matrix) { // "return" the shifted offset, so the caller can e.g. move elements - Point offset = new Point(borderSize, borderSize); + NativePoint offset = new NativePoint(borderSize, borderSize); matrix.Translate(offset.X, offset.Y, MatrixOrder.Append); // Create a new "clean" image @@ -1209,7 +1008,7 @@ namespace Greenshot.Base.Core graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; using (GraphicsPath path = new GraphicsPath()) { - path.AddRectangle(new Rectangle(borderSize >> 1, borderSize >> 1, newImage.Width - borderSize, newImage.Height - borderSize)); + path.AddRectangle(new NativeRect(borderSize >> 1, borderSize >> 1, newImage.Width - borderSize, newImage.Height - borderSize)); using Pen pen = new Pen(borderColor, borderSize) { LineJoin = LineJoin.Round, @@ -1289,7 +1088,7 @@ namespace Greenshot.Base.Core sourceImage.VerticalResolution); using (ImageAttributes adjustAttributes = CreateAdjustAttributes(brightness, contrast, gamma)) { - ApplyImageAttributes((Bitmap) sourceImage, Rectangle.Empty, newBitmap, Rectangle.Empty, adjustAttributes); + ApplyImageAttributes((Bitmap) sourceImage, NativeRect.Empty, newBitmap, NativeRect.Empty, adjustAttributes); } return newBitmap; @@ -1355,7 +1154,7 @@ namespace Greenshot.Base.Core return (Image) sourceImage.Clone(); } - return CloneArea(sourceImage, Rectangle.Empty, PixelFormat.DontCare); + return CloneArea(sourceImage, NativeRect.Empty, PixelFormat.DontCare); } /// @@ -1366,7 +1165,7 @@ namespace Greenshot.Base.Core /// Bitmap with clone image data public static Bitmap Clone(Image sourceBitmap, PixelFormat targetFormat) { - return CloneArea(sourceBitmap, Rectangle.Empty, targetFormat); + return CloneArea(sourceBitmap, NativeRect.Empty, targetFormat); } /// @@ -1377,26 +1176,26 @@ namespace Greenshot.Base.Core /// 2) When going from a transparent to a non transparent bitmap, we draw the background white! /// /// Source bitmap to clone - /// Rectangle to copy from the source, use Rectangle.Empty for all + /// NativeRect to copy from the source, use NativeRect.Empty for all /// Target Format, use PixelFormat.DontCare if you want the original (or a default if the source PixelFormat is not supported) /// - public static Bitmap CloneArea(Image sourceImage, Rectangle sourceRect, PixelFormat targetFormat) + public static Bitmap CloneArea(Image sourceImage, NativeRect sourceRect, PixelFormat targetFormat) { Bitmap newImage; - Rectangle bitmapRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height); + NativeRect bitmapRect = new NativeRect(0, 0, sourceImage.Width, sourceImage.Height); - // Make sure the source is not Rectangle.Empty - if (Rectangle.Empty.Equals(sourceRect)) + // Make sure the source is not NativeRect.Empty + if (NativeRect.Empty.Equals(sourceRect)) { - sourceRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height); + sourceRect = new NativeRect(0, 0, sourceImage.Width, sourceImage.Height); } else { - sourceRect.Intersect(bitmapRect); + sourceRect = sourceRect.Intersect(bitmapRect); } // If no pixelformat is supplied - if (PixelFormat.DontCare == targetFormat || PixelFormat.Undefined == targetFormat) + if (targetFormat is PixelFormat.DontCare or PixelFormat.Undefined) { if (SupportsPixelFormat(sourceImage.PixelFormat)) { @@ -1497,16 +1296,17 @@ namespace Greenshot.Base.Core /// /// the source bitmap as the specifications for the new bitmap /// The color to fill with, or Color.Empty to take the default depending on the pixel format - /// - public static Bitmap CreateEmptyLike(Image sourceImage, Color backgroundColor) + /// PixelFormat + /// Bitmap + public static Bitmap CreateEmptyLike(Image sourceImage, Color backgroundColor, PixelFormat? pixelFormat = null) { - PixelFormat pixelFormat = sourceImage.PixelFormat; + pixelFormat ??= sourceImage.PixelFormat; if (backgroundColor.A < 255) { pixelFormat = PixelFormat.Format32bppArgb; } - return CreateEmpty(sourceImage.Width, sourceImage.Height, pixelFormat, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); + return CreateEmpty(sourceImage.Width, sourceImage.Height, pixelFormat.Value, backgroundColor, sourceImage.HorizontalResolution, sourceImage.VerticalResolution); } /// @@ -1516,10 +1316,10 @@ namespace Greenshot.Base.Core /// /// /// The color to fill with, or Color.Empty to take the default depending on the pixel format - /// - /// + /// float + /// float /// Bitmap - public static Bitmap CreateEmpty(int width, int height, PixelFormat format, Color backgroundColor, float horizontalResolution, float verticalResolution) + public static Bitmap CreateEmpty(int width, int height, PixelFormat format, Color backgroundColor, float horizontalResolution = 96f, float verticalResolution = 96f) { // Create a new "clean" image Bitmap newImage = new Bitmap(width, height, format); @@ -1703,105 +1503,113 @@ namespace Greenshot.Base.Core graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; using ImageAttributes wrapMode = new ImageAttributes(); wrapMode.SetWrapMode(WrapMode.TileFlipXY); - graphics.DrawImage(sourceImage, new Rectangle(destX, destY, destWidth, destHeight), 0, 0, sourceImage.Width, sourceImage.Height, GraphicsUnit.Pixel, wrapMode); + graphics.DrawImage(sourceImage, new NativeRect(destX, destY, destWidth, destHeight), 0, 0, sourceImage.Width, sourceImage.Height, GraphicsUnit.Pixel, wrapMode); } return newImage; } - + /// - /// Load a Greenshot surface from a stream + /// Rotate the image /// - /// Stream - /// - /// ISurface - public static ISurface LoadGreenshotSurface(Stream surfaceFileStream, ISurface returnSurface) + /// Input image + /// Angle in degrees + /// Rotated image + public static Image Rotate(this Image image, float rotationAngle) { - Image fileImage; - // Fixed problem that the bitmap stream is disposed... by Cloning the image - // This also ensures the bitmap is correctly created + var bitmap = CreateEmptyLike(image, Color.Transparent); - // We create a copy of the bitmap, so everything else can be disposed - surfaceFileStream.Position = 0; - using (Image tmpImage = Image.FromStream(surfaceFileStream, true, true)) - { - Log.DebugFormat("Loaded .greenshot file with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); - fileImage = Clone(tmpImage); - } + using var graphics = Graphics.FromImage(bitmap); + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - // Start at -14 read "GreenshotXX.YY" (XX=Major, YY=Minor) - const int markerSize = 14; - surfaceFileStream.Seek(-markerSize, SeekOrigin.End); - using (StreamReader streamReader = new StreamReader(surfaceFileStream)) - { - var greenshotMarker = streamReader.ReadToEnd(); - if (!greenshotMarker.StartsWith("Greenshot")) - { - throw new ArgumentException("Stream is not a Greenshot file!"); - } + graphics.TranslateTransform((float)bitmap.Width / 2, (float)bitmap.Height / 2); + graphics.RotateTransform(rotationAngle); + graphics.TranslateTransform(-(float)bitmap.Width / 2, -(float)bitmap.Height / 2); - Log.InfoFormat("Greenshot file format: {0}", greenshotMarker); - const int filesizeLocation = 8 + markerSize; - surfaceFileStream.Seek(-filesizeLocation, SeekOrigin.End); - using BinaryReader reader = new BinaryReader(surfaceFileStream); - long bytesWritten = reader.ReadInt64(); - surfaceFileStream.Seek(-(bytesWritten + filesizeLocation), SeekOrigin.End); - returnSurface.LoadElementsFromStream(surfaceFileStream); - } + graphics.DrawImage(image, new NativePoint(0, 0)); - if (fileImage != null) - { - returnSurface.Image = fileImage; - Log.InfoFormat("Information about .greenshot file: {0}x{1}-{2} Resolution {3}x{4}", fileImage.Width, fileImage.Height, fileImage.PixelFormat, - fileImage.HorizontalResolution, fileImage.VerticalResolution); - } - - return returnSurface; + return bitmap; } /// - /// Create an image from a stream, if an extension is supplied more formats are supported. + /// Map a System.Drawing.Imaging.PixelFormat to a System.Windows.Media.PixelFormat /// - /// Stream - /// - /// Image - public static Image FromStream(Stream stream, string extension = null) + /// System.Drawing.Imaging.PixelFormat + /// System.Windows.Media.PixelFormat + /// + public static System.Windows.Media.PixelFormat Map(this PixelFormat pixelFormat) => + pixelFormat switch + { + PixelFormat.Format32bppArgb => PixelFormats.Bgra32, + PixelFormat.Format24bppRgb => PixelFormats.Bgr24, + PixelFormat.Format32bppRgb => PixelFormats.Bgr32, + _ => throw new NotSupportedException($"Can't map {pixelFormat}.") + }; + + /// + /// Map a System.Windows.Media.PixelFormat to a System.Drawing.Imaging.PixelFormat + /// + /// System.Windows.Media.PixelFormat + /// System.Drawing.Imaging.PixelFormat + /// + public static PixelFormat Map(this System.Windows.Media.PixelFormat pixelFormat) { - if (stream == null) + if (pixelFormat == PixelFormats.Bgra32) { - return null; + return PixelFormat.Format32bppArgb; + } + if (pixelFormat == PixelFormats.Bgr24) + { + return PixelFormat.Format24bppRgb; + } + if (pixelFormat == PixelFormats.Bgr32) + { + return PixelFormat.Format32bppRgb; } - if (!string.IsNullOrEmpty(extension)) + throw new NotSupportedException($"Can't map {pixelFormat}."); + } + + /// + /// Convert a Bitmap to a BitmapSource + /// + /// Bitmap + /// BitmapSource + public static BitmapSource ToBitmapSource(this Bitmap bitmap) + { + var bitmapData = bitmap.LockBits(new NativeRect(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); + + BitmapSource bitmapSource; + try { - extension = extension.Replace(".", string.Empty); + bitmapSource = BitmapSource.Create( + bitmapData.Width, bitmapData.Height, + bitmap.HorizontalResolution, bitmap.VerticalResolution, + bitmap.PixelFormat.Map(), null, + bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride); + } + finally + { + bitmap.UnlockBits(bitmapData); } - // Make sure we can try multiple times - if (!stream.CanSeek) - { - var memoryStream = new MemoryStream(); - stream.CopyTo(memoryStream); - stream = memoryStream; - } + return bitmapSource; + } - Image returnImage = null; - if (StreamConverters.TryGetValue(extension ?? string.Empty, out var converter)) - { - returnImage = converter(stream, extension); - } + /// + /// Convert a BitmapSource to a Bitmap + /// + /// BitmapSource + /// Bitmap + public static Bitmap ToBitmap(this BitmapSource bitmapSource) + { + var pixelFormat = bitmapSource.Format.Map(); - // Fallback - if (returnImage == null) - { - // We create a copy of the bitmap, so everything else can be disposed - stream.Position = 0; - using var tmpImage = Image.FromStream(stream, true, true); - Log.DebugFormat("Loaded bitmap with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); - returnImage = Clone(tmpImage, PixelFormat.Format32bppArgb); - } - - return returnImage; + Bitmap bitmap = new Bitmap(bitmapSource.PixelWidth, bitmapSource.PixelHeight, pixelFormat); + BitmapData data = bitmap.LockBits(new NativeRect(NativePoint.Empty, bitmap.Size), ImageLockMode.WriteOnly, pixelFormat); + bitmapSource.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); + bitmap.UnlockBits(data); + return bitmap; } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Core/ImageOutput.cs b/src/Greenshot.Base/Core/ImageIO.cs similarity index 59% rename from src/Greenshot.Base/Core/ImageOutput.cs rename to src/Greenshot.Base/Core/ImageIO.cs index 39c4896c1..9d6bbf1cd 100644 --- a/src/Greenshot.Base/Core/ImageOutput.cs +++ b/src/Greenshot.Base/Core/ImageIO.cs @@ -20,12 +20,11 @@ */ using System; -using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; @@ -33,20 +32,20 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using Greenshot.Base.Controls; using Greenshot.Base.Core.Enums; +using Greenshot.Base.Core.FileFormatHandlers; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Plugin; using log4net; -using Encoder = System.Drawing.Imaging.Encoder; namespace Greenshot.Base.Core { /// - /// Description of ImageOutput. + /// This contains all io related logic for image /// - public static class ImageOutput + public static class ImageIO { - private static readonly ILog Log = LogManager.GetLogger(typeof(ImageOutput)); + private static readonly ILog Log = LogManager.GetLogger(typeof(ImageIO)); private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private static readonly int PROPERTY_TAG_SOFTWARE_USED = 0x0131; private static readonly Cache TmpFileCache = new Cache(10 * 60 * 60, RemoveExpiredTmpFile); @@ -54,7 +53,7 @@ namespace Greenshot.Base.Core /// /// Creates a PropertyItem (Metadata) to store with the image. /// For the possible ID's see: https://msdn.microsoft.com/de-de/library/system.drawing.imaging.propertyitem.id(v=vs.80).aspx - /// This code uses Reflection to create a PropertyItem, although it's not adviced it's not as stupid as having a image in the project so we can read a PropertyItem from that! + /// This code uses Reflection to create a PropertyItem, although it's not advised it's not as stupid as having a image in the project so we can read a PropertyItem from that! /// /// ID /// Text @@ -124,102 +123,21 @@ namespace Greenshot.Base.Core try { - var imageFormat = outputSettings.Format switch - { - OutputFormat.bmp => ImageFormat.Bmp, - OutputFormat.gif => ImageFormat.Gif, - OutputFormat.jpg => ImageFormat.Jpeg, - OutputFormat.tiff => ImageFormat.Tiff, - OutputFormat.ico => ImageFormat.Icon, - _ => ImageFormat.Png - }; - Log.DebugFormat("Saving image to stream with Format {0} and PixelFormat {1}", imageFormat, imageToSave.PixelFormat); - - // Check if we want to use a memory stream, to prevent issues with non seakable streams + // Check if we want to use a memory stream, to prevent issues with non seekable streams // The save is made to the targetStream, this is directed to either the MemoryStream or the original Stream targetStream = stream; if (!stream.CanSeek) { useMemoryStream = true; - Log.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); + Log.Warn("Using a memory stream prevent an issue with saving to a non seekable stream."); memoryStream = new MemoryStream(); targetStream = memoryStream; } - if (Equals(imageFormat, ImageFormat.Jpeg)) + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + if (!fileFormatHandlers.TrySaveToStream(imageToSave as Bitmap, targetStream, outputSettings.Format.ToString(), surface, outputSettings)) { - bool foundEncoder = false; - foreach (ImageCodecInfo imageCodec in ImageCodecInfo.GetImageEncoders()) - { - if (imageCodec.FormatID == imageFormat.Guid) - { - EncoderParameters parameters = new EncoderParameters(1) - { - Param = - { - [0] = new EncoderParameter(Encoder.Quality, outputSettings.JPGQuality) - } - }; - // Removing transparency if it's not supported in the output - if (Image.IsAlphaPixelFormat(imageToSave.PixelFormat)) - { - Image nonAlphaImage = ImageHelper.Clone(imageToSave, PixelFormat.Format24bppRgb); - AddTag(nonAlphaImage); - nonAlphaImage.Save(targetStream, imageCodec, parameters); - nonAlphaImage.Dispose(); - } - else - { - AddTag(imageToSave); - imageToSave.Save(targetStream, imageCodec, parameters); - } - - foundEncoder = true; - break; - } - } - - if (!foundEncoder) - { - throw new ApplicationException("No JPG encoder found, this should not happen."); - } - } - else if (Equals(imageFormat, ImageFormat.Icon)) - { - // FEATURE-916: Added Icon support - IList images = new List - { - imageToSave - }; - WriteIcon(stream, images); - } - else - { - bool needsDispose = false; - // Removing transparency if it's not supported in the output - if (!Equals(imageFormat, ImageFormat.Png) && Image.IsAlphaPixelFormat(imageToSave.PixelFormat)) - { - imageToSave = ImageHelper.Clone(imageToSave, PixelFormat.Format24bppRgb); - needsDispose = true; - } - - AddTag(imageToSave); - // Added for OptiPNG - bool processed = false; - if (Equals(imageFormat, ImageFormat.Png) && !string.IsNullOrEmpty(CoreConfig.OptimizePNGCommand)) - { - processed = ProcessPngImageExternally(imageToSave, targetStream); - } - - if (!processed) - { - imageToSave.Save(targetStream, imageFormat); - } - - if (needsDispose) - { - imageToSave.Dispose(); - } + return; } // If we used a memory stream, we need to stream the memory stream to the original stream. @@ -227,21 +145,6 @@ namespace Greenshot.Base.Core { memoryStream.WriteTo(stream); } - - // Output the surface elements, size and marker to the stream - if (outputSettings.Format != OutputFormat.greenshot) - { - return; - } - - using MemoryStream tmpStream = new MemoryStream(); - long bytesWritten = surface.SaveElementsToStream(tmpStream); - using BinaryWriter writer = new BinaryWriter(tmpStream); - writer.Write(bytesWritten); - Version v = Assembly.GetExecutingAssembly().GetName().Version; - byte[] marker = Encoding.ASCII.GetBytes($"Greenshot{v.Major:00}.{v.Minor:00}"); - writer.Write(marker); - tmpStream.WriteTo(stream); } finally { @@ -249,89 +152,6 @@ namespace Greenshot.Base.Core } } - /// - /// Write the passed Image to a tmp-file and call an external process, than read the file back and write it to the targetStream - /// - /// Image to pass to the external process - /// stream to write the processed image to - /// - private static bool ProcessPngImageExternally(Image imageToProcess, Stream targetStream) - { - if (string.IsNullOrEmpty(CoreConfig.OptimizePNGCommand)) - { - return false; - } - - if (!File.Exists(CoreConfig.OptimizePNGCommand)) - { - Log.WarnFormat("Can't find 'OptimizePNGCommand' {0}", CoreConfig.OptimizePNGCommand); - return false; - } - - string tmpFileName = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".png"); - try - { - using (FileStream tmpStream = File.Create(tmpFileName)) - { - Log.DebugFormat("Writing png to tmp file: {0}", tmpFileName); - imageToProcess.Save(tmpStream, ImageFormat.Png); - if (Log.IsDebugEnabled) - { - Log.DebugFormat("File size before processing {0}", new FileInfo(tmpFileName).Length); - } - } - - if (Log.IsDebugEnabled) - { - Log.DebugFormat("Starting : {0}", CoreConfig.OptimizePNGCommand); - } - - ProcessStartInfo processStartInfo = new ProcessStartInfo(CoreConfig.OptimizePNGCommand) - { - Arguments = string.Format(CoreConfig.OptimizePNGCommandArguments, tmpFileName), - CreateNoWindow = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false - }; - using Process process = Process.Start(processStartInfo); - if (process != null) - { - process.WaitForExit(); - if (process.ExitCode == 0) - { - if (Log.IsDebugEnabled) - { - Log.DebugFormat("File size after processing {0}", new FileInfo(tmpFileName).Length); - Log.DebugFormat("Reading back tmp file: {0}", tmpFileName); - } - - byte[] processedImage = File.ReadAllBytes(tmpFileName); - targetStream.Write(processedImage, 0, processedImage.Length); - return true; - } - - Log.ErrorFormat("Error while processing PNG image: {0}", process.ExitCode); - Log.ErrorFormat("Output: {0}", process.StandardOutput.ReadToEnd()); - Log.ErrorFormat("Error: {0}", process.StandardError.ReadToEnd()); - } - } - catch (Exception e) - { - Log.Error("Error while processing PNG image: ", e); - } - finally - { - if (File.Exists(tmpFileName)) - { - Log.DebugFormat("Cleaning up tmp file: {0}", tmpFileName); - File.Delete(tmpFileName); - } - } - - return false; - } - /// /// Create an image from a surface with the settings from the output settings applied /// @@ -429,20 +249,18 @@ namespace Greenshot.Base.Core /// Add the greenshot property! /// /// - private static void AddTag(Image imageToSave) + public static void AddTag(this Image imageToSave) { // Create meta-data PropertyItem softwareUsedPropertyItem = CreatePropertyItem(PROPERTY_TAG_SOFTWARE_USED, "Greenshot"); - if (softwareUsedPropertyItem != null) + if (softwareUsedPropertyItem == null) return; + try { - try - { - imageToSave.SetPropertyItem(softwareUsedPropertyItem); - } - catch (Exception) - { - Log.WarnFormat("Couldn't set property {0}", softwareUsedPropertyItem.Id); - } + imageToSave.SetPropertyItem(softwareUsedPropertyItem); + } + catch (Exception) + { + Log.WarnFormat("Couldn't set property {0}", softwareUsedPropertyItem.Id); } } @@ -463,7 +281,7 @@ namespace Greenshot.Base.Core // Fixed lock problem Bug #3431881 using (Stream surfaceFileStream = File.OpenRead(fullPath)) { - returnSurface = ImageHelper.LoadGreenshotSurface(surfaceFileStream, returnSurface); + returnSurface = LoadGreenshotSurface(surfaceFileStream, returnSurface); } if (returnSurface != null) @@ -547,27 +365,25 @@ namespace Greenshot.Base.Core using (SaveImageFileDialog saveImageFileDialog = new SaveImageFileDialog(captureDetails)) { DialogResult dialogResult = saveImageFileDialog.ShowDialog(); - if (dialogResult.Equals(DialogResult.OK)) + if (!dialogResult.Equals(DialogResult.OK)) return returnValue; + try { - try + string fileNameWithExtension = saveImageFileDialog.FileNameWithExtension; + SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(FormatForFilename(fileNameWithExtension)); + if (CoreConfig.OutputFilePromptQuality) { - string fileNameWithExtension = saveImageFileDialog.FileNameWithExtension; - SurfaceOutputSettings outputSettings = new SurfaceOutputSettings(FormatForFilename(fileNameWithExtension)); - if (CoreConfig.OutputFilePromptQuality) - { - QualityDialog qualityDialog = new QualityDialog(outputSettings); - qualityDialog.ShowDialog(); - } + QualityDialog qualityDialog = new QualityDialog(outputSettings); + qualityDialog.ShowDialog(); + } - // TODO: For now we always overwrite, should be changed - Save(surface, fileNameWithExtension, true, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); - returnValue = fileNameWithExtension; - IniConfig.Save(); - } - catch (ExternalException) - { - MessageBox.Show(Language.GetFormattedString("error_nowriteaccess", saveImageFileDialog.FileName).Replace(@"\\", @"\"), Language.GetString("error")); - } + // TODO: For now we always overwrite, should be changed + Save(surface, fileNameWithExtension, true, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); + returnValue = fileNameWithExtension; + IniConfig.Save(); + } + catch (ExternalException) + { + MessageBox.Show(Language.GetFormattedString("error_nowriteaccess", saveImageFileDialog.FileName).Replace(@"\\", @"\"), Language.GetString("error")); } } @@ -709,91 +525,131 @@ namespace Greenshot.Base.Core } /// - /// Write the images to the stream as icon - /// Every image is resized to 256x256 (but the content maintains the aspect ratio) + /// Load an image from file /// - /// Stream to write to - /// List of images - public static void WriteIcon(Stream stream, IList images) + /// + /// + public static Image LoadImage(string filename) { - var binaryWriter = new BinaryWriter(stream); - // - // ICONDIR structure - // - binaryWriter.Write((short) 0); // reserved - binaryWriter.Write((short) 1); // image type (icon) - binaryWriter.Write((short) images.Count); // number of images - - IList imageSizes = new List(); - IList encodedImages = new List(); - foreach (var image in images) + if (string.IsNullOrEmpty(filename)) { - // Pick the best fit - var sizes = new[] - { - 16, 32, 48 - }; - int size = 256; - foreach (var possibleSize in sizes) - { - if (image.Width <= possibleSize && image.Height <= possibleSize) - { - size = possibleSize; - break; - } - } - - var imageStream = new MemoryStream(); - if (image.Width == size && image.Height == size) - { - using var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb); - clonedImage.Save(imageStream, ImageFormat.Png); - imageSizes.Add(new Size(size, size)); - } - else - { - // Resize to the specified size, first make sure the image is 32bpp - using var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb); - using var resizedImage = ImageHelper.ResizeImage(clonedImage, true, true, Color.Empty, size, size, null); - resizedImage.Save(imageStream, ImageFormat.Png); - imageSizes.Add(resizedImage.Size); - } - - imageStream.Seek(0, SeekOrigin.Begin); - encodedImages.Add(imageStream); + return null; } - // - // ICONDIRENTRY structure - // - const int iconDirSize = 6; - const int iconDirEntrySize = 16; - - var offset = iconDirSize + (images.Count * iconDirEntrySize); - for (int i = 0; i < images.Count; i++) + if (!File.Exists(filename)) { - var imageSize = imageSizes[i]; - // Write the width / height, 0 means 256 - binaryWriter.Write(imageSize.Width == 256 ? (byte) 0 : (byte) imageSize.Width); - binaryWriter.Write(imageSize.Height == 256 ? (byte) 0 : (byte) imageSize.Height); - binaryWriter.Write((byte) 0); // no pallete - binaryWriter.Write((byte) 0); // reserved - binaryWriter.Write((short) 0); // no color planes - binaryWriter.Write((short) 32); // 32 bpp - binaryWriter.Write((int) encodedImages[i].Length); // image data length - binaryWriter.Write(offset); - offset += (int) encodedImages[i].Length; + return null; } - binaryWriter.Flush(); - // - // Write image data - // - foreach (var encodedImage in encodedImages) + Image fileImage; + Log.InfoFormat("Loading image from file {0}", filename); + // Fixed lock problem Bug #3431881 + using (Stream imageFileStream = File.OpenRead(filename)) { - encodedImage.WriteTo(stream); - encodedImage.Dispose(); + fileImage = FromStream(imageFileStream, Path.GetExtension(filename)); } + + if (fileImage != null) + { + Log.InfoFormat("Information about file {0}: {1}x{2}-{3} Resolution {4}x{5}", filename, fileImage.Width, fileImage.Height, fileImage.PixelFormat, + fileImage.HorizontalResolution, fileImage.VerticalResolution); + } + + return fileImage; + } + + /// + /// Create an image from a stream, if an extension is supplied more formats are supported. + /// + /// Stream + /// + /// Image + public static Image FromStream(Stream stream, string extension = null) + { + if (stream == null) + { + return null; + } + + if (!string.IsNullOrEmpty(extension)) + { + extension = extension.Replace(".", string.Empty); + } + + var startingPosition = stream.Position; + + // Make sure we can try multiple times + if (!stream.CanSeek) + { + var memoryStream = new MemoryStream(); + stream.CopyTo(memoryStream); + stream = memoryStream; + // As we are if a different stream, which starts at 0, change the starting position + startingPosition = 0; + } + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + foreach (var fileFormatHandler in fileFormatHandlers + .Where(ffh => ffh.Supports(FileFormatHandlerActions.LoadFromStream, extension)) + .OrderBy(ffh => ffh.PriorityFor(FileFormatHandlerActions.LoadFromStream, extension))) + { + stream.Seek(startingPosition, SeekOrigin.Begin); + if (fileFormatHandler.TryLoadFromStream(stream, extension, out var bitmap)) + { + return bitmap; + } + } + + return null; + } + + /// + /// Load a Greenshot surface from a stream + /// + /// Stream + /// + /// ISurface + public static ISurface LoadGreenshotSurface(Stream surfaceFileStream, ISurface returnSurface) + { + Image fileImage; + // Fixed problem that the bitmap stream is disposed... by Cloning the image + // This also ensures the bitmap is correctly created + + // We create a copy of the bitmap, so everything else can be disposed + surfaceFileStream.Position = 0; + using (Image tmpImage = Image.FromStream(surfaceFileStream, true, true)) + { + Log.DebugFormat("Loaded .greenshot file with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); + fileImage = ImageHelper.Clone(tmpImage); + } + + // Start at -14 read "GreenshotXX.YY" (XX=Major, YY=Minor) + const int markerSize = 14; + surfaceFileStream.Seek(-markerSize, SeekOrigin.End); + using (StreamReader streamReader = new StreamReader(surfaceFileStream)) + { + var greenshotMarker = streamReader.ReadToEnd(); + if (!greenshotMarker.StartsWith("Greenshot")) + { + throw new ArgumentException("Stream is not a Greenshot file!"); + } + + Log.InfoFormat("Greenshot file format: {0}", greenshotMarker); + const int filesizeLocation = 8 + markerSize; + surfaceFileStream.Seek(-filesizeLocation, SeekOrigin.End); + using BinaryReader reader = new BinaryReader(surfaceFileStream); + long bytesWritten = reader.ReadInt64(); + surfaceFileStream.Seek(-(bytesWritten + filesizeLocation), SeekOrigin.End); + returnSurface.LoadElementsFromStream(surfaceFileStream); + } + + if (fileImage != null) + { + returnSurface.Image = fileImage; + Log.InfoFormat("Information about .greenshot file: {0}x{1}-{2} Resolution {3}x{4}", fileImage.Width, fileImage.Height, fileImage.PixelFormat, + fileImage.HorizontalResolution, fileImage.VerticalResolution); + } + + return returnSurface; } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Core/ImageWrapper.cs b/src/Greenshot.Base/Core/ImageWrapper.cs deleted file mode 100644 index 517249534..000000000 --- a/src/Greenshot.Base/Core/ImageWrapper.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Drawing; -using System.Drawing.Imaging; - -namespace Greenshot.Base.Core -{ - /// - /// Wrap an image, make it resizeable - /// - public class ImageWrapper : IImage - { - // Underlying image, is used to generate a resized version of it when needed - private readonly Image _image; - private Image _imageClone; - - public ImageWrapper(Image image) - { - // Make sure the orientation is set correctly so Greenshot can process the image correctly - ImageHelper.Orientate(image); - _image = image; - Width = _image.Width; - Height = _image.Height; - } - - public void Dispose() - { - _image.Dispose(); - _imageClone?.Dispose(); - } - - /// - /// Height of the image, can be set to change - /// - public int Height { get; set; } - - /// - /// Width of the image, can be set to change. - /// - public int Width { get; set; } - - /// - /// Size of the image - /// - public Size Size => new Size(Width, Height); - - /// - /// Pixelformat of the underlying image - /// - public PixelFormat PixelFormat => Image.PixelFormat; - - public float HorizontalResolution => Image.HorizontalResolution; - public float VerticalResolution => Image.VerticalResolution; - - public Image Image - { - get - { - if (_imageClone == null) - { - if (_image.Height == Height && _image.Width == Width) - { - return _image; - } - } - - if (_imageClone?.Height == Height && _imageClone?.Width == Width) - { - return _imageClone; - } - - // Calculate new image clone - _imageClone?.Dispose(); - _imageClone = ImageHelper.ResizeImage(_image, false, Width, Height, null); - return _imageClone; - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/Language.cs b/src/Greenshot.Base/Core/Language.cs index 8037393ad..4627a10fc 100644 --- a/src/Greenshot.Base/Core/Language.cs +++ b/src/Greenshot.Base/Core/Language.cs @@ -470,7 +470,7 @@ namespace Greenshot.Base.Core languageFile }; LanguageFiles.Add(languageFile.Ietf, currentFiles); - Log.InfoFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); + Log.DebugFormat("Added language definition {0} from: {1}", languageFile.Description, languageFile.Filepath); } } } diff --git a/src/Greenshot.Base/Core/NetworkHelper.cs b/src/Greenshot.Base/Core/NetworkHelper.cs index 5170db504..88cfff569 100644 --- a/src/Greenshot.Base/Core/NetworkHelper.cs +++ b/src/Greenshot.Base/Core/NetworkHelper.cs @@ -24,11 +24,14 @@ using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.IO; +using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; +using Greenshot.Base.Core.FileFormatHandlers; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Plugin; using log4net; @@ -87,24 +90,14 @@ namespace Greenshot.Base.Core } /// - /// Download the uri to Bitmap + /// Download the uri to build an IDrawableContainer /// /// Of an image - /// Bitmap - public static Image DownloadImage(string url) + /// IDrawableContainer + public static IDrawableContainer DownloadImageAsDrawableContainer(string url) { - var extensions = new StringBuilder(); - foreach (var extension in ImageHelper.StreamConverters.Keys) - { - if (string.IsNullOrEmpty(extension)) - { - continue; - } - - extensions.AppendFormat(@"\.{0}|", extension); - } - - extensions.Length--; + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + var extensions = string.Join("|", fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadFromStream)); var imageUrlRegex = new Regex($@"(http|https)://.*(?{extensions})"); var match = imageUrlRegex.Match(url); @@ -113,7 +106,12 @@ namespace Greenshot.Base.Core using var memoryStream = GetAsMemoryStream(url); try { - return ImageHelper.FromStream(memoryStream, match.Success ? match.Groups["extension"]?.Value : null); + var extension = match.Success ? match.Groups["extension"]?.Value : null; + var drawableContainer = fileFormatHandlers.LoadDrawablesFromStream(memoryStream, extension).FirstOrDefault(); + if (drawableContainer != null) + { + return drawableContainer; + } } catch (Exception) { @@ -136,7 +134,71 @@ namespace Greenshot.Base.Core } using var memoryStream2 = GetAsMemoryStream(match.Value); - return ImageHelper.FromStream(memoryStream2, match.Groups["extension"]?.Value); + + var extension = match.Success ? match.Groups["extension"]?.Value : null; + var drawableContainer = fileFormatHandlers.LoadDrawablesFromStream(memoryStream2, extension).FirstOrDefault(); + if (drawableContainer != null) + { + return drawableContainer; + } + } + } + catch (Exception e) + { + Log.Error("Problem downloading the image from: " + url, e); + } + + return null; + } + + /// + /// Download the uri to create a Bitmap + /// + /// Of an image + /// Bitmap + public static Bitmap DownloadImage(string url) + { + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + + var extensions = string.Join("|", fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadFromStream)); + + var imageUrlRegex = new Regex($@"(http|https)://.*(?{extensions})"); + var match = imageUrlRegex.Match(url); + try + { + using var memoryStream = GetAsMemoryStream(url); + try + { + if (fileFormatHandlers.TryLoadFromStream(memoryStream, match.Success ? match.Groups["extension"]?.Value : null, out var bitmap)) + { + return bitmap; + } + } + catch (Exception) + { + // If we arrive here, the image loading didn't work, try to see if the response has a http(s) URL to an image and just take this instead. + string content; + using (var streamReader = new StreamReader(memoryStream, Encoding.UTF8, true)) + { + content = streamReader.ReadLine(); + } + + if (string.IsNullOrEmpty(content)) + { + throw; + } + + match = imageUrlRegex.Match(content); + if (!match.Success) + { + throw; + } + + using var memoryStream2 = GetAsMemoryStream(match.Value); + if (fileFormatHandlers.TryLoadFromStream(memoryStream2, match.Success ? match.Groups["extension"]?.Value : null, out var bitmap)) + { + return bitmap; + } } } catch (Exception e) @@ -670,7 +732,7 @@ namespace Greenshot.Base.Core public string ToBase64String(Base64FormattingOptions formattingOptions) { using MemoryStream stream = new MemoryStream(); - ImageOutput.SaveToStream(_surface, stream, _outputSettings); + ImageIO.SaveToStream(_surface, stream, _outputSettings); return Convert.ToBase64String(stream.GetBuffer(), 0, (int) stream.Length, formattingOptions); } @@ -682,7 +744,7 @@ namespace Greenshot.Base.Core public byte[] ToByteArray() { using MemoryStream stream = new MemoryStream(); - ImageOutput.SaveToStream(_surface, stream, _outputSettings); + ImageIO.SaveToStream(_surface, stream, _outputSettings); return stream.ToArray(); } @@ -698,7 +760,7 @@ namespace Greenshot.Base.Core string header = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{Filename ?? name}\";\r\nContent-Type: {ContentType}\r\n\r\n"; formDataStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetByteCount(header)); - ImageOutput.SaveToStream(_surface, formDataStream, _outputSettings); + ImageIO.SaveToStream(_surface, formDataStream, _outputSettings); } /// @@ -708,7 +770,7 @@ namespace Greenshot.Base.Core public void WriteToStream(Stream dataStream) { // Write the file data directly to the Stream, rather than serializing it to a string. - ImageOutput.SaveToStream(_surface, dataStream, _outputSettings); + ImageIO.SaveToStream(_surface, dataStream, _outputSettings); } /// diff --git a/src/Greenshot.Base/Core/PluginUtils.cs b/src/Greenshot.Base/Core/PluginUtils.cs index 3d3ec79f2..76f08422b 100644 --- a/src/Greenshot.Base/Core/PluginUtils.cs +++ b/src/Greenshot.Base/Core/PluginUtils.cs @@ -24,9 +24,10 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; +using System.Linq; using System.Windows.Forms; +using Dapplo.Windows.Icons; using Greenshot.Base.IniFile; -using Greenshot.Base.UnmanagedHelpers; using log4net; using Microsoft.Win32; @@ -39,9 +40,9 @@ namespace Greenshot.Base.Core { private static readonly ILog Log = LogManager.GetLogger(typeof(PluginUtils)); private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); - private const string PathKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; private static readonly IDictionary ExeIconCache = new Dictionary(); - + private const string PathKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\"; + static PluginUtils() { CoreConfig.PropertyChanged += OnIconSizeChanged; @@ -84,7 +85,7 @@ namespace Greenshot.Base.Core if (key != null) { // "" is the default key, which should point to the requested location - return (string) key.GetValue(string.Empty); + return (string)key.GetValue(string.Empty); } } @@ -113,7 +114,7 @@ namespace Greenshot.Base.Core /// /// path to the exe or dll /// index of the icon - /// Bitmap with the icon or null if something happended + /// Bitmap with the icon or null if something happened public static Image GetCachedExeIcon(string path, int index) { string cacheKey = $"{path}:{index}"; @@ -148,7 +149,7 @@ namespace Greenshot.Base.Core /// /// path to the exe or dll /// index of the icon - /// Bitmap with the icon or null if something happended + /// Bitmap with the icon or null if something happened private static Bitmap GetExeIcon(string path, int index) { if (!File.Exists(path)) @@ -158,20 +159,11 @@ namespace Greenshot.Base.Core try { - using (Icon appIcon = ImageHelper.ExtractAssociatedIcon(path, index, CoreConfig.UseLargeIcons)) + var appIcon = IconHelper.ExtractAssociatedIcon(path, index, CoreConfig.UseLargeIcons); + if (appIcon != null) { - if (appIcon != null) - { - return appIcon.ToBitmap(); - } - } - - using (Icon appIcon = Shell32.GetFileIcon(path, CoreConfig.UseLargeIcons ? Shell32.IconSize.Large : Shell32.IconSize.Small, false)) - { - if (appIcon != null) - { - return appIcon.ToBitmap(); - } + Log.DebugFormat("Loaded icon for {0}, with dimensions {1}x{2}", path, appIcon.Width, appIcon.Height); + return appIcon; } } catch (Exception exIcon) @@ -195,27 +187,25 @@ namespace Greenshot.Base.Core // Try to find a separator, so we insert ourselves after it for (int i = 0; i < contextMenu.Items.Count; i++) { - if (contextMenu.Items[i].GetType() == typeof(ToolStripSeparator)) + if (contextMenu.Items[i].GetType() != typeof(ToolStripSeparator)) continue; + // Check if we need to add a new separator, which is done if the first found has a Tag with the value "PluginsAreAddedBefore" + if ("PluginsAreAddedBefore".Equals(contextMenu.Items[i].Tag)) { - // Check if we need to add a new separator, which is done if the first found has a Tag with the value "PluginsAreAddedBefore" - if ("PluginsAreAddedBefore".Equals(contextMenu.Items[i].Tag)) + var separator = new ToolStripSeparator { - var separator = new ToolStripSeparator - { - Tag = "PluginsAreAddedAfter", - Size = new Size(305, 6) - }; - contextMenu.Items.Insert(i, separator); - } - else if (!"PluginsAreAddedAfter".Equals(contextMenu.Items[i].Tag)) - { - continue; - } - - contextMenu.Items.Insert(i + 1, item); - addedItem = true; - break; + Tag = "PluginsAreAddedAfter", + Size = new Size(305, 6) + }; + contextMenu.Items.Insert(i, separator); } + else if (!"PluginsAreAddedAfter".Equals(contextMenu.Items[i].Tag)) + { + continue; + } + + contextMenu.Items.Insert(i + 1, item); + addedItem = true; + break; } // If we didn't insert the item, we just add it... diff --git a/src/Greenshot.Base/Core/SimpleServiceProvider.cs b/src/Greenshot.Base/Core/SimpleServiceProvider.cs index bff814540..084f5b1fd 100644 --- a/src/Greenshot.Base/Core/SimpleServiceProvider.cs +++ b/src/Greenshot.Base/Core/SimpleServiceProvider.cs @@ -10,22 +10,19 @@ namespace Greenshot.Base.Core /// public class SimpleServiceProvider : IServiceLocator { - private readonly Dictionary> _services = new Dictionary>(); + private readonly Dictionary> _services = new(); public static IServiceLocator Current { get; } = new SimpleServiceProvider(); - public IEnumerable GetAllInstances() + public IReadOnlyList GetAllInstances() { var typeOfService = typeof(TService); if (!_services.TryGetValue(typeOfService, out var results)) { - yield break; + return Array.Empty(); } - foreach (TService result in results) - { - yield return result; - } + return results.Cast().ToArray(); } public TService GetInstance() diff --git a/src/Greenshot.Base/Core/SvgImage.cs b/src/Greenshot.Base/Core/SvgImage.cs deleted file mode 100644 index 25f98b212..000000000 --- a/src/Greenshot.Base/Core/SvgImage.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using Svg; - -namespace Greenshot.Base.Core -{ - /// - /// Create an image look like of the SVG - /// - public sealed class SvgImage : IImage - { - private readonly SvgDocument _svgDocument; - - private Image _imageClone; - - /// - /// Factory to create via a stream - /// - /// Stream - /// IImage - public static IImage FromStream(Stream stream) - { - return new SvgImage(stream); - } - - /// - /// Default constructor - /// - /// - public SvgImage(Stream stream) - { - _svgDocument = SvgDocument.Open(stream); - Height = (int) _svgDocument.ViewBox.Height; - Width = (int) _svgDocument.ViewBox.Width; - } - - /// - /// Height of the image, can be set to change - /// - public int Height { get; set; } - - /// - /// Width of the image, can be set to change. - /// - public int Width { get; set; } - - /// - /// Size of the image - /// - public Size Size => new Size(Width, Height); - - /// - /// Pixelformat of the underlying image - /// - public PixelFormat PixelFormat => Image.PixelFormat; - - /// - /// Horizontal resolution of the underlying image - /// - public float HorizontalResolution => Image.HorizontalResolution; - - /// - /// Vertical resolution of the underlying image - /// - public float VerticalResolution => Image.VerticalResolution; - - /// - /// Underlying image, or an on demand rendered version with different attributes as the original - /// - public Image Image - { - get - { - if (_imageClone?.Height == Height && _imageClone?.Width == Width) - { - return _imageClone; - } - - // Calculate new image clone - _imageClone?.Dispose(); - _imageClone = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent, 96, 96); - _svgDocument.Draw((Bitmap) _imageClone); - return _imageClone; - } - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - _imageClone?.Dispose(); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Core/WindowCapture.cs b/src/Greenshot.Base/Core/WindowCapture.cs index 3b5bfdbe4..01e1bce56 100644 --- a/src/Greenshot.Base/Core/WindowCapture.cs +++ b/src/Greenshot.Base/Core/WindowCapture.cs @@ -26,10 +26,20 @@ using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32; +using Dapplo.Windows.Gdi32.Enums; +using Dapplo.Windows.Gdi32.SafeHandles; +using Dapplo.Windows.Gdi32.Structs; +using Dapplo.Windows.Icons; +using Dapplo.Windows.Icons.SafeHandles; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Enums; +using Dapplo.Windows.User32.Structs; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Structs; using log4net; namespace Greenshot.Base.Core @@ -42,35 +52,6 @@ namespace Greenshot.Base.Core private static readonly ILog Log = LogManager.GetLogger(typeof(WindowCapture)); private static readonly CoreConfiguration Configuration = IniConfig.GetIniSection(); - /// - /// Used to cleanup the unmanaged resource in the iconInfo for the CaptureCursor method - /// - /// - /// - [DllImport("gdi32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool DeleteObject(IntPtr hObject); - - /// - /// Get the bounds of all screens combined. - /// - /// A Rectangle of the bounds of the entire display area. - public static Rectangle GetScreenBounds() - { - int left = 0, top = 0, bottom = 0, right = 0; - foreach (Screen screen in Screen.AllScreens) - { - left = Math.Min(left, screen.Bounds.X); - top = Math.Min(top, screen.Bounds.Y); - int screenAbsRight = screen.Bounds.X + screen.Bounds.Width; - int screenAbsBottom = screen.Bounds.Y + screen.Bounds.Height; - right = Math.Max(right, screenAbsRight); - bottom = Math.Max(bottom, screenAbsBottom); - } - - return new Rectangle(left, top, (right + Math.Abs(left)), (bottom + Math.Abs(top))); - } - /// /// Retrieves the cursor location safely, accounting for DPI settings in Vista/Windows 7. This implementation /// can conveniently be used when the cursor location is needed to deal with a fullscreen bitmap. @@ -78,9 +59,9 @@ namespace Greenshot.Base.Core /// /// Point with cursor location, relative to the top left corner of the monitor setup (which itself might actually not be on any screen) /// - public static Point GetCursorLocationRelativeToScreenBounds() + public static NativePoint GetCursorLocationRelativeToScreenBounds() { - return GetLocationRelativeToScreenBounds(User32.GetCursorLocation()); + return GetLocationRelativeToScreenBounds(User32Api.GetCursorLocation()); } /// @@ -90,12 +71,10 @@ namespace Greenshot.Base.Core /// /// /// Point - public static Point GetLocationRelativeToScreenBounds(Point locationRelativeToScreenOrigin) + public static NativePoint GetLocationRelativeToScreenBounds(NativePoint locationRelativeToScreenOrigin) { - Point ret = locationRelativeToScreenOrigin; - Rectangle bounds = GetScreenBounds(); - ret.Offset(-bounds.X, -bounds.Y); - return ret; + NativeRect bounds = DisplayInfo.ScreenBounds; + return locationRelativeToScreenOrigin.Offset(-bounds.X, -bounds.Y); } /// @@ -110,36 +89,26 @@ namespace Greenshot.Base.Core capture = new Capture(); } - var cursorInfo = new CursorInfo(); - cursorInfo.cbSize = Marshal.SizeOf(cursorInfo); - if (!User32.GetCursorInfo(out cursorInfo)) return capture; - if (cursorInfo.flags != User32.CURSOR_SHOWING) return capture; + var cursorInfo = CursorInfo.Create(); + if (!NativeCursorMethods.GetCursorInfo(ref cursorInfo)) return capture; + if (cursorInfo.Flags != CursorInfoFlags.Showing) return capture; - using SafeIconHandle safeIcon = User32.CopyIcon(cursorInfo.hCursor); - if (!User32.GetIconInfo(safeIcon, out var iconInfo)) return capture; + using SafeIconHandle safeIcon = NativeIconMethods.CopyIcon(cursorInfo.CursorHandle); + if (!NativeIconMethods.GetIconInfo(safeIcon, out var iconInfo)) return capture; - Point cursorLocation = User32.GetCursorLocation(); + NativePoint cursorLocation = User32Api.GetCursorLocation(); // Align cursor location to Bitmap coordinates (instead of Screen coordinates) - var x = cursorLocation.X - iconInfo.xHotspot - capture.ScreenBounds.X; - var y = cursorLocation.Y - iconInfo.yHotspot - capture.ScreenBounds.Y; + var x = cursorLocation.X - iconInfo.Hotspot.X - capture.ScreenBounds.X; + var y = cursorLocation.Y - iconInfo.Hotspot.Y - capture.ScreenBounds.Y; // Set the location - capture.CursorLocation = new Point(x, y); + capture.CursorLocation = new NativePoint(x, y); using (Icon icon = Icon.FromHandle(safeIcon.DangerousGetHandle())) { capture.Cursor = icon; } - - if (iconInfo.hbmMask != IntPtr.Zero) - { - DeleteObject(iconInfo.hbmMask); - } - - if (iconInfo.hbmColor != IntPtr.Zero) - { - DeleteObject(iconInfo.hbmColor); - } - + iconInfo.BitmaskBitmapHandle.Dispose(); + iconInfo.ColorBitmapHandle.Dispose(); return capture; } @@ -161,11 +130,11 @@ namespace Greenshot.Base.Core /// Helper method to create an exception that might explain what is wrong while capturing /// /// string with current method - /// Rectangle of what we want to capture + /// NativeRect of what we want to capture /// - private static Exception CreateCaptureException(string method, Rectangle captureBounds) + private static Exception CreateCaptureException(string method, NativeRect captureBounds) { - Exception exceptionToThrow = User32.CreateWin32Exception(method); + Exception exceptionToThrow = User32Api.CreateWin32Exception(method); if (!captureBounds.IsEmpty) { exceptionToThrow.Data.Add("Height", captureBounds.Height); @@ -233,9 +202,9 @@ namespace Greenshot.Base.Core /// This method will use User32 code to capture the specified captureBounds from the screen /// /// ICapture where the captured Bitmap will be stored - /// Rectangle with the bounds to capture + /// NativeRect with the bounds to capture /// A Capture Object with a part of the Screen as an Image - public static ICapture CaptureRectangle(ICapture capture, Rectangle captureBounds) + public static ICapture CaptureRectangle(ICapture capture, NativeRect captureBounds) { if (capture == null) { @@ -271,9 +240,9 @@ namespace Greenshot.Base.Core /// This method will use User32 code to capture the specified captureBounds from the screen /// /// ICapture where the captured Bitmap will be stored - /// Rectangle with the bounds to capture + /// NativeRect with the bounds to capture /// A Capture Object with a part of the Screen as an Image - public static ICapture CaptureRectangleFromDesktopScreen(ICapture capture, Rectangle captureBounds) + public static ICapture CaptureRectangleFromDesktopScreen(ICapture capture, NativeRect captureBounds) { if (capture == null) { @@ -288,9 +257,9 @@ namespace Greenshot.Base.Core /// /// This method will use User32 code to capture the specified captureBounds from the screen /// - /// Rectangle with the bounds to capture + /// NativeRect with the bounds to capture /// Bitmap which is captured from the screen at the location specified by the captureBounds - public static Bitmap CaptureRectangle(Rectangle captureBounds) + public static Bitmap CaptureRectangle(NativeRect captureBounds) { Bitmap returnBitmap = null; if (captureBounds.Height <= 0 || captureBounds.Width <= 0) @@ -321,7 +290,7 @@ namespace Greenshot.Base.Core } // create a device context we can copy to - using SafeCompatibleDCHandle safeCompatibleDcHandle = GDI32.CreateCompatibleDC(desktopDcHandle); + using SafeCompatibleDcHandle safeCompatibleDcHandle = Gdi32Api.CreateCompatibleDC(desktopDcHandle); // Check if the device context is there, if not throw an error with as much info as possible! if (safeCompatibleDcHandle.IsInvalid) { @@ -332,13 +301,13 @@ namespace Greenshot.Base.Core } // Create BITMAPINFOHEADER for CreateDIBSection - BITMAPINFOHEADER bmi = new BITMAPINFOHEADER(captureBounds.Width, captureBounds.Height, 24); + var bitmapInfoHeader = BitmapV5Header.Create(captureBounds.Width, captureBounds.Height, 24); // Make sure the last error is set to 0 - Win32.SetLastError(0); + Kernel32Api.SetLastError(0); // create a bitmap we can copy it to, using GetDeviceCaps to get the width/height - using SafeDibSectionHandle safeDibSectionHandle = GDI32.CreateDIBSection(desktopDcHandle, ref bmi, BITMAPINFOHEADER.DIB_RGB_COLORS, out _, IntPtr.Zero, 0); + using SafeDibSectionHandle safeDibSectionHandle = Gdi32Api.CreateDIBSection(desktopDcHandle, ref bitmapInfoHeader, DibColors.RgbColors, out _, IntPtr.Zero, 0); if (safeDibSectionHandle.IsInvalid) { // Get Exception before the error is lost @@ -355,8 +324,8 @@ namespace Greenshot.Base.Core { // bitblt over (make copy) // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags - GDI32.BitBlt(safeCompatibleDcHandle, 0, 0, captureBounds.Width, captureBounds.Height, desktopDcHandle, captureBounds.X, captureBounds.Y, - CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt); + Gdi32Api.BitBlt(safeCompatibleDcHandle, 0, 0, captureBounds.Width, captureBounds.Height, desktopDcHandle, captureBounds.X, captureBounds.Y, + RasterOperations.SourceCopy | RasterOperations.CaptureBlt); } // get a .NET image object for it @@ -388,7 +357,7 @@ namespace Greenshot.Base.Core } // If the region is not empty, we have "offscreenContent" - using Graphics screenGraphics = Graphics.FromHwnd(User32.GetDesktopWindow()); + using Graphics screenGraphics = Graphics.FromHwnd(User32Api.GetDesktopWindow()); offscreenContent = !captureRegion.IsEmpty(screenGraphics); } @@ -397,17 +366,16 @@ namespace Greenshot.Base.Core { using Bitmap tmpBitmap = Image.FromHbitmap(safeDibSectionHandle.DangerousGetHandle()); // Create a new bitmap which has a transparent background - returnBitmap = ImageHelper.CreateEmpty(tmpBitmap.Width, tmpBitmap.Height, PixelFormat.Format32bppArgb, Color.Transparent, - tmpBitmap.HorizontalResolution, tmpBitmap.VerticalResolution); + returnBitmap = ImageHelper.CreateEmpty(tmpBitmap.Width, tmpBitmap.Height, PixelFormat.Format32bppArgb, Color.Transparent, tmpBitmap.HorizontalResolution, tmpBitmap.VerticalResolution); // Content will be copied here using Graphics graphics = Graphics.FromImage(returnBitmap); // For all screens copy the content to the new bitmap - foreach (Screen screen in Screen.AllScreens) + + foreach (var displayInfo in DisplayInfo.AllDisplayInfos) { - Rectangle screenBounds = screen.Bounds; - // Make sure the bounds are offsetted to the capture bounds - screenBounds.Offset(-captureBounds.X, -captureBounds.Y); - graphics.DrawImage(tmpBitmap, screenBounds, screenBounds.X, screenBounds.Y, screenBounds.Width, screenBounds.Height, GraphicsUnit.Pixel); + // Make sure the bounds are offset to the capture bounds + var displayBounds = displayInfo.Bounds.Offset(-captureBounds.X, -captureBounds.Y); + graphics.DrawImage(tmpBitmap, displayBounds, displayBounds.X, displayBounds.Y, displayBounds.Width, displayBounds.Height, GraphicsUnit.Pixel); } } else diff --git a/src/Greenshot.Base/Core/WindowDetails.cs b/src/Greenshot.Base/Core/WindowDetails.cs index 91ee52de1..9cdf5f370 100644 --- a/src/Greenshot.Base/Core/WindowDetails.cs +++ b/src/Greenshot.Base/Core/WindowDetails.cs @@ -7,13 +7,25 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; +using Dapplo.Windows.Common; +using Dapplo.Windows.Common.Enums; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.DesktopWindowsManager; +using Dapplo.Windows.DesktopWindowsManager.Enums; +using Dapplo.Windows.DesktopWindowsManager.Structs; +using Dapplo.Windows.Gdi32; +using Dapplo.Windows.Gdi32.SafeHandles; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.Kernel32.Enums; +using Dapplo.Windows.Messages.Enumerations; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Enums; +using Dapplo.Windows.User32.Structs; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interop; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; using log4net; namespace Greenshot.Base.Core @@ -30,8 +42,6 @@ namespace Greenshot.Base.Core { private const string AppWindowClass = "Windows.UI.Core.CoreWindow"; //Used for Windows 8(.1) private const string AppFrameWindowClass = "ApplicationFrameWindow"; // Windows 10 uses ApplicationFrameWindow - private const string ApplauncherClass = "ImmersiveLauncher"; - private const string GutterClass = "ImmersiveGutter"; private static readonly IList IgnoreClasses = new List(new[] { @@ -77,13 +87,7 @@ namespace Greenshot.Base.Core private IntPtr _parentHandle = IntPtr.Zero; private WindowDetails _parent; private bool _frozen; - - /// - /// This checks if the window is a Windows 8 App - /// For Windows 10 most normal code works, as it's hosted inside "ApplicationFrameWindow" - /// - public bool IsApp => AppWindowClass.Equals(ClassName); - + /// /// This checks if the window is a Windows 10 App /// For Windows 10 apps are hosted inside "ApplicationFrameWindow" @@ -96,20 +100,6 @@ namespace Greenshot.Base.Core public bool IsBackgroundWin10App => WindowsVersion.IsWindows10OrLater && AppFrameWindowClass.Equals(ClassName) && !Children.Any(window => string.Equals(window.ClassName, AppWindowClass)); - /// - /// Check if the window is the metro gutter (sizeable separator) - /// - public bool IsGutter => GutterClass.Equals(ClassName); - - /// - /// Test if this window is for the App-Launcher - /// - public bool IsAppLauncher => ApplauncherClass.Equals(ClassName); - - /// - /// Check if this window is the window of a metro app - /// - public bool IsMetroApp => IsAppLauncher || IsApp; /// /// To allow items to be compared, the hash code @@ -187,8 +177,8 @@ namespace Greenshot.Base.Core } // Get the process id - User32.GetWindowThreadProcessId(Handle, out var processId); - return Kernel32.GetProcessPath(processId); + User32Api.GetWindowThreadProcessId(Handle, out var processId); + return Kernel32Api.GetProcessPath(processId); } } @@ -214,12 +204,6 @@ namespace Greenshot.Base.Core Log.Warn(ex); } - if (IsMetroApp) - { - // No method yet to get the metro icon - return null; - } - try { return PluginUtils.GetCachedExeIcon(ProcessPath, 0); @@ -248,35 +232,35 @@ namespace Greenshot.Base.Core IntPtr iconHandle; if (Conf.UseLargeIcons) { - iconHandle = User32.SendMessage(hWnd, (int) WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); + iconHandle = User32Api.SendMessage(hWnd, WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); if (iconHandle == IntPtr.Zero) { - iconHandle = User32.GetClassLongWrapper(hWnd, (int) ClassLongIndex.GCL_HICON); + iconHandle = User32Api.GetClassLongWrapper(hWnd, ClassLongIndex.IconHandle); } } else { - iconHandle = User32.SendMessage(hWnd, (int) WindowsMessages.WM_GETICON, iconSmall2, IntPtr.Zero); + iconHandle = User32Api.SendMessage(hWnd, WindowsMessages.WM_GETICON, iconSmall2, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.SendMessage(hWnd, (int) WindowsMessages.WM_GETICON, iconSmall, IntPtr.Zero); + iconHandle = User32Api.SendMessage(hWnd, WindowsMessages.WM_GETICON, iconSmall, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.GetClassLongWrapper(hWnd, (int) ClassLongIndex.GCL_HICONSM); + iconHandle = User32Api.GetClassLongWrapper(hWnd, ClassLongIndex.IconHandle); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.SendMessage(hWnd, (int) WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); + iconHandle = User32Api.SendMessage(hWnd, WindowsMessages.WM_GETICON, iconBig, IntPtr.Zero); } if (iconHandle == IntPtr.Zero) { - iconHandle = User32.GetClassLongWrapper(hWnd, (int) ClassLongIndex.GCL_HICON); + iconHandle = User32Api.GetClassLongWrapper(hWnd, ClassLongIndex.IconHandle); } if (iconHandle == IntPtr.Zero) @@ -342,7 +326,7 @@ namespace Greenshot.Base.Core { if (_parentHandle == IntPtr.Zero) { - _parentHandle = User32.GetParent(Handle); + _parentHandle = User32Api.GetParent(Handle); _parent = null; } @@ -368,7 +352,7 @@ namespace Greenshot.Base.Core { if (_parentHandle == IntPtr.Zero) { - _parentHandle = User32.GetParent(Handle); + _parentHandle = User32Api.GetParent(Handle); } if (_parentHandle != IntPtr.Zero) @@ -434,9 +418,7 @@ namespace Greenshot.Base.Core { if (_text == null) { - var title = new StringBuilder(260, 260); - User32.GetWindowText(Handle, title, title.Capacity); - _text = title.ToString(); + _text = User32Api.GetText(Handle); } return _text; @@ -448,7 +430,7 @@ namespace Greenshot.Base.Core /// /// Gets the window's class name. /// - public string ClassName => _className ??= GetClassName(Handle); + public string ClassName => _className ??= User32Api.GetClassname(Handle); /// /// Gets/Sets whether the window is iconic (minimized) or not. @@ -457,22 +439,17 @@ namespace Greenshot.Base.Core { get { - if (IsMetroApp) - { - return !Visible; - } - - return User32.IsIconic(Handle) || Location.X <= -32000; + return User32Api.IsIconic(Handle) || Location.X <= -32000; } set { if (value) { - User32.SendMessage(Handle, (int) WindowsMessages.WM_SYSCOMMAND, (IntPtr) User32.SC_MINIMIZE, IntPtr.Zero); + User32Api.SendMessage(Handle, WindowsMessages.WM_SYSCOMMAND, SysCommands.SC_MINIMIZE, IntPtr.Zero); } else { - User32.SendMessage(Handle, (int) WindowsMessages.WM_SYSCOMMAND, (IntPtr) User32.SC_RESTORE, IntPtr.Zero); + User32Api.SendMessage(Handle, WindowsMessages.WM_SYSCOMMAND, SysCommands.SC_RESTORE, IntPtr.Zero); } } } @@ -484,37 +461,17 @@ namespace Greenshot.Base.Core { get { - if (IsApp) - { - if (Visible) - { - Rectangle windowRectangle = WindowRectangle; - foreach (var screen in Screen.AllScreens) - { - if (screen.Bounds.Contains(windowRectangle)) - { - if (windowRectangle.Equals(screen.Bounds)) - { - return true; - } - } - } - } - - return false; - } - - return User32.IsZoomed(Handle); + return User32Api.IsZoomed(Handle); } set { if (value) { - User32.SendMessage(Handle, (int) WindowsMessages.WM_SYSCOMMAND, (IntPtr) User32.SC_MAXIMIZE, IntPtr.Zero); + User32Api.SendMessage(Handle, WindowsMessages.WM_SYSCOMMAND, SysCommands.SC_MAXIMIZE, IntPtr.Zero); } else { - User32.SendMessage(Handle, (int) WindowsMessages.WM_SYSCOMMAND, (IntPtr) User32.SC_MINIMIZE, IntPtr.Zero); + User32Api.SendMessage(Handle, WindowsMessages.WM_SYSCOMMAND, SysCommands.SC_MINIMIZE, IntPtr.Zero); } } } @@ -524,7 +481,7 @@ namespace Greenshot.Base.Core /// public bool IsCloaked { - get => DWM.IsWindowCloaked(Handle); + get => DwmApi.IsWindowCloaked(Handle); } /// @@ -540,52 +497,7 @@ namespace Greenshot.Base.Core return false; } - if (IsApp) - { - Rectangle windowRectangle = WindowRectangle; - foreach (Screen screen in Screen.AllScreens) - { - if (screen.Bounds.Contains(windowRectangle)) - { - if (windowRectangle.Equals(screen.Bounds)) - { - // Fullscreen, it's "visible" when AppVisibilityOnMonitor says yes - // Although it might be the other App, this is not "very" important - RECT rect = new RECT(screen.Bounds); - IntPtr monitor = User32.MonitorFromRect(ref rect, User32.MONITOR_DEFAULTTONULL); - if (monitor != IntPtr.Zero) - { - MONITOR_APP_VISIBILITY? monitorAppVisibility = AppVisibility?.GetAppVisibilityOnMonitor(monitor); - //LOG.DebugFormat("App {0} visible: {1} on {2}", Text, monitorAppVisibility, screen.Bounds); - if (monitorAppVisibility == MONITOR_APP_VISIBILITY.MAV_APP_VISIBLE) - { - return true; - } - } - } - else - { - // Is only partly on the screen, when this happens the app is always visible! - return true; - } - } - } - - return false; - } - - if (IsGutter) - { - // gutter is only made available when it's visible - return true; - } - - if (IsAppLauncher) - { - return IsAppLauncherVisible; - } - - return User32.IsWindowVisible(Handle); + return User32Api.IsWindowVisible(Handle); } } @@ -602,7 +514,7 @@ namespace Greenshot.Base.Core { get { - User32.GetWindowThreadProcessId(Handle, out var processId); + User32Api.GetWindowThreadProcessId(Handle, out var processId); return processId; } } @@ -613,7 +525,7 @@ namespace Greenshot.Base.Core { try { - User32.GetWindowThreadProcessId(Handle, out var processId); + User32Api.GetWindowThreadProcessId(Handle, out var processId); return Process.GetProcessById(processId); } catch (Exception ex) @@ -625,114 +537,92 @@ namespace Greenshot.Base.Core } } - private Rectangle _previousWindowRectangle = Rectangle.Empty; + private NativeRect _previousWindowRectangle = NativeRect.Empty; private long _lastWindowRectangleRetrieveTime; private const long CacheTime = TimeSpan.TicksPerSecond * 2; /// /// Gets the bounding rectangle of the window /// - public Rectangle WindowRectangle + public NativeRect WindowRectangle { get { // Try to return a cached value long now = DateTime.Now.Ticks; - if (_previousWindowRectangle.IsEmpty || !_frozen) + if (!_previousWindowRectangle.IsEmpty && _frozen) return _previousWindowRectangle; + + if (!_previousWindowRectangle.IsEmpty && now - _lastWindowRectangleRetrieveTime <= CacheTime) { - if (!_previousWindowRectangle.IsEmpty && now - _lastWindowRectangleRetrieveTime <= CacheTime) + return _previousWindowRectangle; + } + NativeRect windowRect = new(); + if (DwmApi.IsDwmEnabled) + { + bool gotFrameBounds = GetExtendedFrameBounds(out windowRect); + if (IsWin10App) { - return _previousWindowRectangle; - } - - Rectangle windowRect = Rectangle.Empty; - if (DWM.IsDwmEnabled) - { - bool gotFrameBounds = GetExtendedFrameBounds(out windowRect); - if (IsApp) + // Pre-Cache for maximized call, this is only on Windows 8 apps (full screen) + if (gotFrameBounds) { - // Pre-Cache for maximized call, this is only on Windows 8 apps (full screen) - if (gotFrameBounds) - { - _previousWindowRectangle = windowRect; - _lastWindowRectangleRetrieveTime = now; - } - } - - if (gotFrameBounds && WindowsVersion.IsWindows10OrLater && !Maximised) - { - // Somehow DWM doesn't calculate it corectly, there is a 1 pixel border around the capture - // Remove this border, currently it's fixed but TODO: Make it depend on the OS? - windowRect.Inflate(Conf.Win10BorderCrop); _previousWindowRectangle = windowRect; _lastWindowRectangleRetrieveTime = now; - return windowRect; } } - if (windowRect.IsEmpty) + if (gotFrameBounds && WindowsVersion.IsWindows10OrLater && !Maximised) { - if (!GetWindowRect(out windowRect)) - { - Win32Error error = Win32.GetLastErrorCode(); - Log.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); - } + // Somehow DWM doesn't calculate it correctly, there is a 1 pixel border around the capture + // Remove this border, currently it's fixed but TODO: Make it depend on the OS? + windowRect = windowRect.Inflate(Conf.Win10BorderCrop); + _previousWindowRectangle = windowRect; + _lastWindowRectangleRetrieveTime = now; + return windowRect; } - - // Correction for maximized windows, only if it's not an app - if (!HasParent && !IsApp && Maximised) - { - // Only if the border size can be retrieved - if (GetBorderSize(out var size)) - { - windowRect = new Rectangle(windowRect.X + size.Width, windowRect.Y + size.Height, windowRect.Width - (2 * size.Width), - windowRect.Height - (2 * size.Height)); - } - } - - _lastWindowRectangleRetrieveTime = now; - // Try to return something valid, by getting returning the previous size if the window doesn't have a Rectangle anymore - if (windowRect.IsEmpty) - { - return _previousWindowRectangle; - } - - _previousWindowRectangle = windowRect; - return windowRect; } - return _previousWindowRectangle; + if (windowRect.IsEmpty) + { + if (!GetWindowRect(out windowRect)) + { + Win32Error error = Win32.GetLastErrorCode(); + Log.WarnFormat("Couldn't retrieve the windows rectangle: {0}", Win32.GetMessage(error)); + } + } + + _lastWindowRectangleRetrieveTime = now; + // Try to return something valid, by getting returning the previous size if the window doesn't have a NativeRect anymore + if (windowRect.IsEmpty) + { + return _previousWindowRectangle; + } + + _previousWindowRectangle = windowRect; + return windowRect; + } } /// /// Gets the location of the window relative to the screen. /// - public Point Location + public NativePoint Location { - get - { - Rectangle tmpRectangle = WindowRectangle; - return new Point(tmpRectangle.Left, tmpRectangle.Top); - } + get => WindowRectangle.Location; } /// /// Gets the size of the window. /// - public Size Size + public NativeSize Size { - get - { - Rectangle tmpRectangle = WindowRectangle; - return new Size(tmpRectangle.Right - tmpRectangle.Left, tmpRectangle.Bottom - tmpRectangle.Top); - } + get => WindowRectangle.Size; } /// /// Get the client rectangle, this is the part of the window inside the borders (drawable area) /// - public Rectangle ClientRectangle + public NativeRect ClientRectangle { get { @@ -751,7 +641,7 @@ namespace Greenshot.Base.Core /// /// Point with the coordinates to check /// true if the point lies within - public bool Contains(Point p) + public bool Contains(NativePoint p) { return WindowRectangle.Contains(p); } @@ -764,11 +654,11 @@ namespace Greenshot.Base.Core { if (Iconic) { - User32.SendMessage(Handle, (int) WindowsMessages.WM_SYSCOMMAND, (IntPtr) User32.SC_RESTORE, IntPtr.Zero); + User32Api.SendMessage(Handle, WindowsMessages.WM_SYSCOMMAND, SysCommands.SC_RESTORE, IntPtr.Zero); } - User32.BringWindowToTop(Handle); - User32.SetForegroundWindow(Handle); + User32Api.BringWindowToTop(Handle); + User32Api.SetForegroundWindow(Handle); // Make sure windows has time to perform the action // TODO: this is BAD practice! while (Iconic) @@ -782,8 +672,10 @@ namespace Greenshot.Base.Core /// public WindowStyleFlags WindowStyle { - get => (WindowStyleFlags) User32.GetWindowLongWrapper(Handle, (int) WindowLongIndex.GWL_STYLE); - set => User32.SetWindowLongWrapper(Handle, (int) WindowLongIndex.GWL_STYLE, new IntPtr((long) value)); + get => unchecked( + (WindowStyleFlags)User32Api.GetWindowLongWrapper(Handle, WindowLongIndex.GWL_STYLE).ToInt64() + ); + set => User32Api.SetWindowLongWrapper(Handle, WindowLongIndex.GWL_STYLE, new IntPtr((long) value)); } /// @@ -793,11 +685,11 @@ namespace Greenshot.Base.Core { get { - var placement = WindowPlacement.Default; - User32.GetWindowPlacement(Handle, ref placement); + var placement = WindowPlacement.Create(); + User32Api.GetWindowPlacement(Handle, ref placement); return placement; } - set { User32.SetWindowPlacement(Handle, ref value); } + set { User32Api.SetWindowPlacement(Handle, ref value); } } /// @@ -805,8 +697,8 @@ namespace Greenshot.Base.Core /// public ExtendedWindowStyleFlags ExtendedWindowStyle { - get => (ExtendedWindowStyleFlags) User32.GetWindowLongWrapper(Handle, (int) WindowLongIndex.GWL_EXSTYLE); - set => User32.SetWindowLongWrapper(Handle, (int) WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint) value)); + get => (ExtendedWindowStyleFlags) User32Api.GetWindowLongWrapper(Handle, WindowLongIndex.GWL_EXSTYLE); + set => User32Api.SetWindowLongWrapper(Handle, WindowLongIndex.GWL_EXSTYLE, new IntPtr((uint) value)); } /// @@ -817,14 +709,11 @@ namespace Greenshot.Base.Core public ICapture CaptureGdiWindow(ICapture capture) { Image capturedImage = PrintWindow(); - if (capturedImage != null) - { - capture.Image = capturedImage; - capture.Location = Location; - return capture; - } + if (capturedImage == null) return null; + capture.Image = capturedImage; + capture.Location = Location; + return capture; - return null; } /// @@ -849,10 +738,10 @@ namespace Greenshot.Base.Core }; // Register the Thumbnail - DWM.DwmRegisterThumbnail(tempForm.Handle, Handle, out thumbnailHandle); + DwmApi.DwmRegisterThumbnail(tempForm.Handle, Handle, out thumbnailHandle); // Get the original size - DWM.DwmQueryThumbnailSourceSize(thumbnailHandle, out var sourceSize); + DwmApi.DwmQueryThumbnailSourceSize(thumbnailHandle, out var sourceSize); if (sourceSize.Width <= 0 || sourceSize.Height <= 0) { @@ -860,9 +749,9 @@ namespace Greenshot.Base.Core } // Calculate the location of the temp form - Rectangle windowRectangle = WindowRectangle; - Point formLocation = windowRectangle.Location; - Size borderSize = new Size(); + NativeRect windowRectangle = WindowRectangle; + NativePoint formLocation = windowRectangle.Location; + NativeSize borderSize = new NativeSize(); bool doesCaptureFit = false; if (!Maximised) { @@ -883,12 +772,13 @@ namespace Greenshot.Base.Core if (!workingArea.AreRectangleCornersVisisble(windowRectangle)) { // If none found we find the biggest screen - foreach (Screen screen in Screen.AllScreens) + + foreach (var displayInfo in DisplayInfo.AllDisplayInfos) { - Rectangle newWindowRectangle = new Rectangle(screen.WorkingArea.Location, windowRectangle.Size); + var newWindowRectangle = new NativeRect(displayInfo.WorkingArea.Location, windowRectangle.Size); if (workingArea.AreRectangleCornersVisisble(newWindowRectangle)) { - formLocation = screen.Bounds.Location; + formLocation = displayInfo.Bounds.Location; doesCaptureFit = true; break; } @@ -903,26 +793,26 @@ namespace Greenshot.Base.Core { //GetClientRect(out windowRectangle); GetBorderSize(out borderSize); - formLocation = new Point(windowRectangle.X - borderSize.Width, windowRectangle.Y - borderSize.Height); + formLocation = new NativePoint(windowRectangle.X - borderSize.Width, windowRectangle.Y - borderSize.Height); } tempForm.Location = formLocation; - tempForm.Size = sourceSize.ToSize(); + tempForm.Size = sourceSize; // Prepare rectangle to capture from the screen. - Rectangle captureRectangle = new Rectangle(formLocation.X, formLocation.Y, sourceSize.Width, sourceSize.Height); + var captureRectangle = new NativeRect(formLocation.X, formLocation.Y, sourceSize.Width, sourceSize.Height); if (Maximised) { // Correct capture size for maximized window by offsetting the X,Y with the border size // and subtracting the border from the size (2 times, as we move right/down for the capture without resizing) - captureRectangle.Inflate(borderSize.Width, borderSize.Height); + captureRectangle = captureRectangle.Inflate(borderSize.Width, borderSize.Height); } else { // TODO: Also 8.x? if (WindowsVersion.IsWindows10OrLater) { - captureRectangle.Inflate(Conf.Win10BorderCrop); + captureRectangle = captureRectangle.Inflate(Conf.Win10BorderCrop); } if (autoMode) @@ -932,7 +822,7 @@ namespace Greenshot.Base.Core { // if GDI is allowed.. (a screenshot won't be better than we comes if we continue) using Process thisWindowProcess = Process; - if (!IsMetroApp && WindowCapture.IsGdiAllowed(thisWindowProcess)) + if (WindowCapture.IsGdiAllowed(thisWindowProcess)) { // we return null which causes the capturing code to try another method. return null; @@ -942,18 +832,18 @@ namespace Greenshot.Base.Core } // Prepare the displaying of the Thumbnail - DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES + var props = new DwmThumbnailProperties() { Opacity = 255, Visible = true, - Destination = new RECT(0, 0, sourceSize.Width, sourceSize.Height) + Destination = new NativeRect(0, 0, sourceSize.Width, sourceSize.Height) }; - DWM.DwmUpdateThumbnailProperties(thumbnailHandle, ref props); + DwmApi.DwmUpdateThumbnailProperties(thumbnailHandle, ref props); tempForm.Show(); tempFormShown = true; // Intersect with screen - captureRectangle.Intersect(capture.ScreenBounds); + captureRectangle = captureRectangle.Intersect(capture.ScreenBounds); // Destination bitmap for the capture Bitmap capturedBitmap = null; @@ -977,11 +867,8 @@ namespace Greenshot.Base.Core tempForm.BackColor = Color.Black; // Make sure everything is visible tempForm.Refresh(); - if (!IsMetroApp) - { - // Make sure the application window is active, so the colors & buttons are right - ToForeground(); - } + // Make sure the application window is active, so the colors & buttons are right + ToForeground(); // Make sure all changes are processed and visible Application.DoEvents(); @@ -1010,19 +897,15 @@ namespace Greenshot.Base.Core } else { - Color colorizationColor = DWM.ColorizationColor; + var colorizationColor = DwmApi.ColorizationColor; // Modify by losing the transparency and increasing the intensity (as if the background color is white) - colorizationColor = Color.FromArgb(255, (colorizationColor.R + 255) >> 1, (colorizationColor.G + 255) >> 1, (colorizationColor.B + 255) >> 1); - tempForm.BackColor = colorizationColor; + tempForm.BackColor = Color.FromArgb(255, (colorizationColor.R + 255) >> 1, (colorizationColor.G + 255) >> 1, (colorizationColor.B + 255) >> 1); } // Make sure everything is visible tempForm.Refresh(); - if (!IsMetroApp) - { - // Make sure the application window is active, so the colors & buttons are right - ToForeground(); - } + // Make sure the application window is active, so the colors & buttons are right + ToForeground(); // Make sure all changes are processed and visible Application.DoEvents(); @@ -1069,8 +952,8 @@ namespace Greenshot.Base.Core { if (thumbnailHandle != IntPtr.Zero) { - // Unregister (cleanup), as we are finished we don't need the form or the thumbnail anymore - DWM.DwmUnregisterThumbnail(thumbnailHandle); + // Un-register (cleanup), as we are finished we don't need the form or the thumbnail anymore + DwmApi.DwmUnregisterThumbnail(thumbnailHandle); } if (tempForm != null) @@ -1081,7 +964,6 @@ namespace Greenshot.Base.Core } tempForm.Dispose(); - tempForm = null; } } @@ -1110,7 +992,7 @@ namespace Greenshot.Base.Core /// /// Apply transparency by comparing a transparent capture with a black and white background /// A "Math.min" makes sure there is no overflow, but this could cause the picture to have shifted colors. - /// The pictures should have been taken without differency, except for the colors. + /// The pictures should have been taken without difference, except for the colors. /// /// Bitmap with the black image /// Bitmap with the black image @@ -1160,49 +1042,67 @@ namespace Greenshot.Base.Core return targetBuffer.UnlockAndReturnBitmap(); } + /// + /// If a window is hidden (Iconic), it also has the specified dimensions. + /// + /// NativeRect + /// bool true if hidden + private bool IsHidden(NativeRect rect) => rect.Width == 65535 && rect.Height == 65535 && rect.Left == 32767 && rect.Top == 32767; + /// /// Helper method to get the window size for DWM Windows /// - /// out Rectangle + /// out NativeRect /// bool true if it worked - private bool GetExtendedFrameBounds(out Rectangle rectangle) + private bool GetExtendedFrameBounds(out NativeRect rectangle) { - int result = DWM.DwmGetWindowAttribute(Handle, DWMWINDOWATTRIBUTE.DWMWA_EXTENDED_FRAME_BOUNDS, out RECT rect, Marshal.SizeOf(typeof(RECT))); - if (result >= 0) + var result = DwmApi.DwmGetWindowAttribute(Handle, DwmWindowAttributes.ExtendedFrameBounds, out NativeRect rect, Marshal.SizeOf(typeof(NativeRect))); + if (result.Succeeded()) { - rectangle = rect.ToRectangle(); + if (IsHidden(rect)) + { + rect = NativeRect.Empty; + } + rectangle = rect; return true; } - rectangle = Rectangle.Empty; + rectangle = NativeRect.Empty; return false; } /// /// Helper method to get the window size for GDI Windows /// - /// out Rectangle + /// out NativeRect /// bool true if it worked - private bool GetClientRect(out Rectangle rectangle) + private bool GetClientRect(out NativeRect rectangle) { var windowInfo = new WindowInfo(); // Get the Window Info for this window - bool result = User32.GetWindowInfo(Handle, ref windowInfo); - rectangle = result ? windowInfo.rcClient.ToRectangle() : Rectangle.Empty; + bool result = User32Api.GetWindowInfo(Handle, ref windowInfo); + rectangle = result ? windowInfo.ClientBounds : NativeRect.Empty; return result; } /// /// Helper method to get the window size for GDI Windows /// - /// out Rectangle + /// out NativeRect /// bool true if it worked - private bool GetWindowRect(out Rectangle rectangle) + private bool GetWindowRect(out NativeRect rectangle) { var windowInfo = new WindowInfo(); // Get the Window Info for this window - bool result = User32.GetWindowInfo(Handle, ref windowInfo); - rectangle = result ? windowInfo.rcWindow.ToRectangle() : Rectangle.Empty; + bool result = User32Api.GetWindowInfo(Handle, ref windowInfo); + if (IsHidden(windowInfo.Bounds)) + { + rectangle = NativeRect.Empty; + } + else + { + rectangle = result ? windowInfo.Bounds : NativeRect.Empty; + } return result; } @@ -1211,12 +1111,12 @@ namespace Greenshot.Base.Core /// /// out Size /// bool true if it worked - private bool GetBorderSize(out Size size) + private bool GetBorderSize(out NativeSize size) { var windowInfo = new WindowInfo(); // Get the Window Info for this window - bool result = User32.GetWindowInfo(Handle, ref windowInfo); - size = result ? new Size((int) windowInfo.cxWindowBorders, (int) windowInfo.cyWindowBorders) : Size.Empty; + bool result = User32Api.GetWindowInfo(Handle, ref windowInfo); + size = result ? windowInfo.BorderSize : NativeSize.Empty; return result; } @@ -1226,7 +1126,7 @@ namespace Greenshot.Base.Core /// hWnd of the window to bring to the foreground public static void ToForeground(IntPtr hWnd) { - var foregroundWindow = User32.GetForegroundWindow(); + var foregroundWindow = User32Api.GetForegroundWindow(); if (hWnd == foregroundWindow) { return; @@ -1239,22 +1139,22 @@ namespace Greenshot.Base.Core return; } - var threadId1 = User32.GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero); - var threadId2 = User32.GetWindowThreadProcessId(hWnd, IntPtr.Zero); + var threadId1 = User32Api.GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero); + var threadId2 = User32Api.GetWindowThreadProcessId(hWnd, IntPtr.Zero); // Show window in foreground. if (threadId1 != threadId2) { - User32.AttachThreadInput(threadId1, threadId2, 1); - User32.SetForegroundWindow(hWnd); - User32.AttachThreadInput(threadId1, threadId2, 0); + User32Api.AttachThreadInput(threadId1, threadId2, 1); + User32Api.SetForegroundWindow(hWnd); + User32Api.AttachThreadInput(threadId1, threadId2, 0); } else { - User32.SetForegroundWindow(hWnd); + User32Api.SetForegroundWindow(hWnd); } - User32.BringWindowToTop(hWnd); + User32Api.BringWindowToTop(hWnd); if (window.Iconic) { @@ -1275,12 +1175,12 @@ namespace Greenshot.Base.Core /// private Region GetRegion() { - using (SafeRegionHandle region = GDI32.CreateRectRgn(0, 0, 0, 0)) + using (SafeRegionHandle region = Gdi32Api.CreateRectRgn(0, 0, 0, 0)) { if (!region.IsInvalid) { - RegionResult result = User32.GetWindowRgn(Handle, region); - if (result != RegionResult.REGION_ERROR && result != RegionResult.REGION_NULLREGION) + var result = User32Api.GetWindowRgn(Handle, region); + if (result != RegionResults.Error && result != RegionResults.NullRegion) { return Region.FromHrgn(region.DangerousGetHandle()); } @@ -1340,7 +1240,7 @@ namespace Greenshot.Base.Core foreach (ProcessThread pT in proc.Threads) { - IntPtr pOpenThread = Kernel32.OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint) pT.Id); + IntPtr pOpenThread = Kernel32Api.OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint) pT.Id); if (pOpenThread == IntPtr.Zero) { @@ -1348,7 +1248,7 @@ namespace Greenshot.Base.Core } frozen = true; - Kernel32.SuspendThread(pOpenThread); + Kernel32Api.SuspendThread(pOpenThread); pT.Dispose(); } } @@ -1379,45 +1279,49 @@ namespace Greenshot.Base.Core foreach (ProcessThread pT in proc.Threads) { - IntPtr pOpenThread = Kernel32.OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint) pT.Id); + IntPtr pOpenThread = Kernel32Api.OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint) pT.Id); if (pOpenThread == IntPtr.Zero) { break; } - Kernel32.ResumeThread(pOpenThread); + Kernel32Api.ResumeThread(pOpenThread); } } /// /// Return an Image representing the Window! - /// As GDI+ draws it, it will be without Aero borders! + /// For Windows 7, as GDI+ draws it, it will be without Aero borders! + /// For Windows 10+, there is an option PW_RENDERFULLCONTENT, which makes sure the capture is "as is". /// public Image PrintWindow() { - Rectangle windowRect = WindowRectangle; + NativeRect windowRect = WindowRectangle; // Start the capture - Exception exceptionOccured = null; + Exception exceptionOccurred = null; Image returnImage; using (Region region = GetRegion()) { + var backgroundColor = Color.Black; PixelFormat pixelFormat = PixelFormat.Format24bppRgb; // Only use 32 bpp ARGB when the window has a region if (region != null) { pixelFormat = PixelFormat.Format32bppArgb; + backgroundColor = Color.Transparent; } - - returnImage = new Bitmap(windowRect.Width, windowRect.Height, pixelFormat); + + returnImage = ImageHelper.CreateEmpty(windowRect.Width, windowRect.Height, pixelFormat, backgroundColor, 96,96); using Graphics graphics = Graphics.FromImage(returnImage); - using (SafeDeviceContextHandle graphicsDc = graphics.GetSafeDeviceContext()) + using (SafeGraphicsDcHandle graphicsDc = graphics.GetSafeDeviceContext()) { - bool printSucceeded = User32.PrintWindow(Handle, graphicsDc.DangerousGetHandle(), 0x0); + var pwFlags = WindowsVersion.IsWindows10OrLater ? PrintWindowFlags.PW_RENDERFULLCONTENT : PrintWindowFlags.PW_COMPLETE; + bool printSucceeded = User32Api.PrintWindow(Handle, graphicsDc.DangerousGetHandle(), pwFlags); if (!printSucceeded) { - // something went wrong, most likely a "0x80004005" (Acess Denied) when using UAC - exceptionOccured = User32.CreateWin32Exception("PrintWindow"); + // something went wrong, most likely a "0x80004005" (Access Denied) when using UAC + exceptionOccurred = User32Api.CreateWin32Exception("PrintWindow"); } } @@ -1432,19 +1336,18 @@ namespace Greenshot.Base.Core } // Return null if error - if (exceptionOccured != null) + if (exceptionOccurred != null) { - Log.ErrorFormat("Error calling print window: {0}", exceptionOccured.Message); + Log.ErrorFormat("Error calling print window: {0}", exceptionOccurred.Message); returnImage.Dispose(); return null; } if (!HasParent && Maximised) { - Log.Debug("Correcting for maximalization"); + Log.Debug("Correcting for maximized window"); GetBorderSize(out var borderSize); - Rectangle borderRectangle = new Rectangle(borderSize.Width, borderSize.Height, windowRect.Width - (2 * borderSize.Width), - windowRect.Height - (2 * borderSize.Height)); + NativeRect borderRectangle = new NativeRect(borderSize.Width, borderSize.Height, windowRect.Width - (2 * borderSize.Width), windowRect.Height - (2 * borderSize.Height)); ImageHelper.Crop(ref returnImage, ref borderRectangle); } @@ -1467,7 +1370,7 @@ namespace Greenshot.Base.Core /// WindowDetails of the current window public static WindowDetails GetActiveWindow() { - IntPtr hWnd = User32.GetForegroundWindow(); + IntPtr hWnd = User32Api.GetForegroundWindow(); if (hWnd != IntPtr.Zero) { if (IgnoreHandles.Contains(hWnd)) @@ -1494,7 +1397,7 @@ namespace Greenshot.Base.Core /// WindowDetails for the desktop window public static WindowDetails GetDesktopWindow() { - return new WindowDetails(User32.GetDesktopWindow()); + return new WindowDetails(User32Api.GetDesktopWindow()); } /// @@ -1518,9 +1421,9 @@ namespace Greenshot.Base.Core /// /// Recursive "find children which" /// - /// point to check for - /// - public WindowDetails FindChildUnderPoint(Point point) + /// NativePoint to check for + /// WindowDetails + public WindowDetails FindChildUnderPoint(NativePoint point) { if (!Contains(point)) { @@ -1546,25 +1449,13 @@ namespace Greenshot.Base.Core return this; } - /// - /// Retrieves the classname for a hWnd - /// - /// IntPtr with the windows handle - /// String with ClassName - public static string GetClassName(IntPtr hWnd) - { - var classNameBuilder = new StringBuilder(260, 260); - User32.GetClassName(hWnd, classNameBuilder, classNameBuilder.Capacity); - return classNameBuilder.ToString(); - } - /// /// Helper method to decide if a top level window is visible /// /// /// /// - private static bool IsVisible(WindowDetails window, Rectangle screenBounds) + private static bool IsVisible(WindowDetails window, NativeRect screenBounds) { // Ignore invisible if (!window.Visible) @@ -1584,8 +1475,7 @@ namespace Greenshot.Base.Core } // On windows which are visible on the screen - var windowRect = window.WindowRectangle; - windowRect.Intersect(screenBounds); + var windowRect = window.WindowRectangle.Intersect(screenBounds); if (windowRect.IsEmpty) { return false; @@ -1593,7 +1483,7 @@ namespace Greenshot.Base.Core // Skip everything which is not rendered "normally", trying to fix BUG-2017 var exWindowStyle = window.ExtendedWindowStyle; - if (!window.IsApp && !window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) + if (!window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) { return false; } @@ -1607,14 +1497,7 @@ namespace Greenshot.Base.Core /// List WindowDetails with all the visible top level windows public static IEnumerable GetVisibleWindows() { - Rectangle screenBounds = WindowCapture.GetScreenBounds(); - foreach (var window in GetAppWindows()) - { - if (IsVisible(window, screenBounds)) - { - yield return window; - } - } + var screenBounds = DisplayInfo.ScreenBounds; foreach (var window in GetAllWindows()) { @@ -1625,38 +1508,6 @@ namespace Greenshot.Base.Core } } - /// - /// Get the WindowDetails for all Metro Apps - /// These are all Windows with Classname "Windows.UI.Core.CoreWindow" - /// - /// List WindowDetails with visible metro apps - public static IEnumerable GetAppWindows() - { - // if the appVisibility != null we have Windows 8. - if (AppVisibility == null) - { - yield break; - } - - var nextHandle = User32.FindWindow(AppWindowClass, null); - while (nextHandle != IntPtr.Zero) - { - var metroApp = new WindowDetails(nextHandle); - yield return metroApp; - // Check if we have a gutter! - if (metroApp.Visible && !metroApp.Maximised) - { - var gutterHandle = User32.FindWindow(GutterClass, null); - if (gutterHandle != IntPtr.Zero) - { - yield return new WindowDetails(gutterHandle); - } - } - - nextHandle = User32.FindWindowEx(IntPtr.Zero, nextHandle, AppWindowClass, null); - } - } - /// /// Check if the window is a top level /// @@ -1687,7 +1538,7 @@ namespace Greenshot.Base.Core } // Skip everything which is not rendered "normally", trying to fix BUG-2017 - if (!window.IsApp && !window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) + if (!window.IsWin10App && (exWindowStyle & ExtendedWindowStyleFlags.WS_EX_NOREDIRECTIONBITMAP) != 0) { return false; } @@ -1723,14 +1574,6 @@ namespace Greenshot.Base.Core /// List WindowDetails with all the top level windows public static IEnumerable GetTopLevelWindows() { - foreach (var possibleTopLevel in GetAppWindows()) - { - if (IsTopLevel(possibleTopLevel)) - { - yield return possibleTopLevel; - } - } - foreach (var possibleTopLevel in GetAllWindows()) { if (IsTopLevel(possibleTopLevel)) @@ -1806,27 +1649,6 @@ namespace Greenshot.Base.Core } } - /// - /// Get the AppLauncher - /// - /// - public static WindowDetails GetAppLauncher() - { - // Only if Windows 8 (or higher) - if (AppVisibility == null) - { - return null; - } - - IntPtr appLauncher = User32.FindWindow(ApplauncherClass, null); - if (appLauncher != IntPtr.Zero) - { - return new WindowDetails(appLauncher); - } - - return null; - } - /// /// Return true if the metro-app-launcher is visible /// @@ -1858,9 +1680,8 @@ namespace Greenshot.Base.Core result.AppendLine($"Size: {WindowRectangle.Size}"); result.AppendLine($"HasParent: {HasParent}"); result.AppendLine($"IsWin10App: {IsWin10App}"); - result.AppendLine($"IsApp: {IsApp}"); result.AppendLine($"Visible: {Visible}"); - result.AppendLine($"IsWindowVisible: {User32.IsWindowVisible(Handle)}"); + result.AppendLine($"IsWindowVisible: {User32Api.IsWindowVisible(Handle)}"); result.AppendLine($"IsCloaked: {IsCloaked}"); result.AppendLine($"Iconic: {Iconic}"); result.AppendLine($"IsBackgroundWin10App: {IsBackgroundWin10App}"); diff --git a/src/Greenshot.Base/Core/WindowsEnumerator.cs b/src/Greenshot.Base/Core/WindowsEnumerator.cs index df3de72b0..1db1f5007 100644 --- a/src/Greenshot.Base/Core/WindowsEnumerator.cs +++ b/src/Greenshot.Base/Core/WindowsEnumerator.cs @@ -21,8 +21,7 @@ using System; using System.Collections.Generic; -using System.Text; -using Greenshot.Base.UnmanagedHelpers; +using Dapplo.Windows.User32; namespace Greenshot.Base.Core { @@ -44,15 +43,13 @@ namespace Greenshot.Base.Core public WindowsEnumerator GetWindows(IntPtr hWndParent, string classname) { Items = new List(); - User32.EnumChildWindows(hWndParent, WindowEnum, IntPtr.Zero); + User32Api.EnumChildWindows(hWndParent, OnWindowEnum, IntPtr.Zero); bool hasParent = !IntPtr.Zero.Equals(hWndParent); string parentText = null; if (hasParent) { - var title = new StringBuilder(260, 260); - User32.GetWindowText(hWndParent, title, title.Capacity); - parentText = title.ToString(); + parentText = User32Api.GetText(hWndParent); } var windows = new List(); @@ -74,17 +71,6 @@ namespace Greenshot.Base.Core return this; } - /// - /// The enum Windows callback. - /// - /// Window Handle - /// Application defined value - /// 1 to continue enumeration, 0 to stop - private int WindowEnum(IntPtr hWnd, int lParam) - { - return OnWindowEnum(hWnd) ? 1 : 0; - } - /// /// Called whenever a new window is about to be added /// by the Window enumeration called from GetWindows. @@ -94,8 +80,9 @@ namespace Greenshot.Base.Core /// be empty. /// /// Window handle to add + /// /// True to continue enumeration, False to stop - private bool OnWindowEnum(IntPtr hWnd) + private bool OnWindowEnum(IntPtr hWnd, IntPtr lParam) { if (!WindowDetails.IsIgnoreHandle(hWnd)) { diff --git a/src/Greenshot.Base/Core/WmInputLangChangeRequestFilter.cs b/src/Greenshot.Base/Core/WmInputLangChangeRequestFilter.cs index a76fcdf21..fb95dccb3 100644 --- a/src/Greenshot.Base/Core/WmInputLangChangeRequestFilter.cs +++ b/src/Greenshot.Base/Core/WmInputLangChangeRequestFilter.cs @@ -20,7 +20,7 @@ */ using System.Windows.Forms; -using Greenshot.Base.UnmanagedHelpers.Enums; +using Dapplo.Windows.Messages.Enumerations; using log4net; namespace Greenshot.Base.Core @@ -51,16 +51,13 @@ namespace Greenshot.Base.Core public static bool PreFilterMessageExternal(ref Message m) { WindowsMessages message = (WindowsMessages) m.Msg; - if (message == WindowsMessages.WM_INPUTLANGCHANGEREQUEST || message == WindowsMessages.WM_INPUTLANGCHANGE) - { - LOG.WarnFormat("Filtering: {0}, {1:X} - {2:X} - {3:X}", message, m.LParam.ToInt64(), m.WParam.ToInt64(), m.HWnd.ToInt64()); - // For now we always return true - return true; - // But it could look something like this: - //return (m.LParam.ToInt64() | 0x7FFFFFFF) != 0; - } + if (message != WindowsMessages.WM_INPUTLANGCHANGEREQUEST && message != WindowsMessages.WM_INPUTLANGCHANGE) return false; - return false; + LOG.DebugFormat("Filtering: {0}, {1:X} - {2:X} - {3:X}", message, m.LParam.ToInt64(), m.WParam.ToInt64(), m.HWnd.ToInt64()); + // For now we always return true + return true; + // But it could look something like this: + //return (m.LParam.ToInt64() | 0x7FFFFFFF) != 0; } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Effects/DropShadowEffect.cs b/src/Greenshot.Base/Effects/DropShadowEffect.cs index 8f69854bc..b597e4463 100644 --- a/src/Greenshot.Base/Effects/DropShadowEffect.cs +++ b/src/Greenshot.Base/Effects/DropShadowEffect.cs @@ -23,6 +23,7 @@ using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; namespace Greenshot.Base.Effects @@ -42,7 +43,7 @@ namespace Greenshot.Base.Effects public int ShadowSize { get; set; } - public Point ShadowOffset { get; set; } + public NativePoint ShadowOffset { get; set; } public virtual void Reset() { diff --git a/src/Greenshot.Base/Greenshot.Base.csproj b/src/Greenshot.Base/Greenshot.Base.csproj index 958e14fcf..550682cd0 100644 --- a/src/Greenshot.Base/Greenshot.Base.csproj +++ b/src/Greenshot.Base/Greenshot.Base.csproj @@ -3,12 +3,22 @@ true + + none + false + - - - - + + + + + + + + + + diff --git a/src/Greenshot.Base/Hooking/WindowsEventHook.cs b/src/Greenshot.Base/Hooking/WindowsEventHook.cs deleted file mode 100644 index 7982cc35a..000000000 --- a/src/Greenshot.Base/Hooking/WindowsEventHook.cs +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.Hooking -{ - /// - /// The WinEventHook can register handlers to become important windows events - /// This makes it possible to know a.o. when a window is created, moved, updated and closed. - /// - public class WindowsEventHook : IDisposable - { - private readonly WinEventDelegate _winEventHandler; - private GCHandle _gcHandle; - - /// - /// Used with Register hook - /// - /// - /// - /// - /// - /// - /// - public delegate void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); - - /// - /// Create a WindowsEventHook object - /// - public WindowsEventHook() - { - _winEventHandler = WinEventDelegateHandler; - _gcHandle = GCHandle.Alloc(_winEventHandler); - } - - [DllImport("user32", SetLastError = true)] - private static extern bool UnhookWinEvent(IntPtr hWinEventHook); - - [DllImport("user32", SetLastError = true)] - private static extern IntPtr SetWinEventHook(WinEvent eventMin, WinEvent eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, int idProcess, int idThread, - WinEventHookFlags dwFlags); - - /// - /// Used with SetWinEventHook - /// - /// - /// - /// - /// - /// - /// - /// - private delegate void WinEventDelegate(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); - - private readonly IDictionary _winEventHandlers = new Dictionary(); - - /// - /// Are hooks active? - /// - public bool IsHooked => _winEventHandlers.Count > 0; - - /// - /// Hook a WinEvent - /// - /// - /// - /// true if success - public void Hook(WinEvent winEvent, WinEventHandler winEventHandler) - { - Hook(winEvent, winEvent, winEventHandler); - } - - /// - /// Hook a WinEvent - /// - /// - /// - /// - public void Hook(WinEvent winEventStart, WinEvent winEventEnd, WinEventHandler winEventHandler) - { - var hookPtr = SetWinEventHook(winEventStart, winEventEnd, IntPtr.Zero, _winEventHandler, 0, 0, - WinEventHookFlags.WINEVENT_SKIPOWNPROCESS | WinEventHookFlags.WINEVENT_OUTOFCONTEXT); - _winEventHandlers.Add(hookPtr, winEventHandler); - } - - /// - /// Remove all hooks - /// - private void Unhook() - { - foreach (var hookPtr in _winEventHandlers.Keys) - { - if (hookPtr != IntPtr.Zero) - { - UnhookWinEvent(hookPtr); - } - } - - _winEventHandlers.Clear(); - _gcHandle.Free(); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Unhook(); - } - - /// - /// Call the WinEventHandler for this event - /// - /// - /// - /// - /// - /// - /// - /// - private void WinEventDelegateHandler(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) - { - if (_winEventHandlers.TryGetValue(hWinEventHook, out var handler)) - { - handler(eventType, hWnd, idObject, idChild, dwEventThread, dwmsEventTime); - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Hooking/WindowsOpenCloseMonitor.cs b/src/Greenshot.Base/Hooking/WindowsOpenCloseMonitor.cs deleted file mode 100644 index b8a4781a3..000000000 --- a/src/Greenshot.Base/Hooking/WindowsOpenCloseMonitor.cs +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using Greenshot.Base.Core; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.Hooking -{ - /// - /// Event arguments for the WindowOpenCloseEvent - /// - public class WindowOpenCloseEventArgs : EventArgs - { - public bool IsOpen { get; set; } - - /// - /// HWnd of the window which has a changed title - /// - public IntPtr HWnd { get; set; } - - /// - /// Title which is changed - /// - public string Title { get; set; } - - public string ClassName { get; set; } - } - - /// - /// Delegate for the window open close event - /// - /// - public delegate void WindowOpenCloseEventDelegate(WindowOpenCloseEventArgs eventArgs); - - /// - /// Monitor all new and destroyed windows - /// - public sealed class WindowsOpenCloseMonitor : IDisposable - { - private WindowsEventHook _hook; - private readonly object _lockObject = new object(); - - // ReSharper disable once InconsistentNaming - private event WindowOpenCloseEventDelegate _windowOpenCloseEvent; - - /// - /// Add / remove event handler to the title monitor - /// - public event WindowOpenCloseEventDelegate WindowOpenCloseChangeEvent - { - add - { - lock (_lockObject) - { - if (_hook == null) - { - _hook = new WindowsEventHook(); - _hook.Hook(WinEvent.EVENT_OBJECT_CREATE, WinEvent.EVENT_OBJECT_DESTROY, WinEventHandler); - } - - _windowOpenCloseEvent += value; - } - } - remove - { - lock (_lockObject) - { - _windowOpenCloseEvent -= value; - if (_windowOpenCloseEvent == null || _windowOpenCloseEvent.GetInvocationList().Length == 0) - { - if (_hook != null) - { - _hook.Dispose(); - _hook = null; - } - } - } - } - } - - /// - /// WinEventDelegate for the creation and destruction - /// - /// - /// - /// - /// - /// - /// - private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) - { - if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) - { - return; - } - - if (eventType == WinEvent.EVENT_OBJECT_CREATE) - { - if (_windowOpenCloseEvent != null) - { - var windowsDetails = new WindowDetails(hWnd); - _windowOpenCloseEvent(new WindowOpenCloseEventArgs - { - HWnd = hWnd, - IsOpen = true, - Title = windowsDetails.Text, - ClassName = windowsDetails.ClassName - }); - } - } - - if (eventType == WinEvent.EVENT_OBJECT_DESTROY) - { - _windowOpenCloseEvent?.Invoke(new WindowOpenCloseEventArgs - { - HWnd = hWnd, - IsOpen = false - }); - } - } - - private bool _disposedValue; // To detect redundant calls - - /// - /// Dispose the underlying hook - /// - public void Dispose(bool disposing) - { - if (_disposedValue) - { - return; - } - - lock (_lockObject) - { - _hook?.Dispose(); - } - - _disposedValue = true; - } - - /// - /// Make sure the finalizer disposes the underlying hook - /// - ~WindowsOpenCloseMonitor() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(false); - } - - /// - /// Dispose the underlying hook - /// - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - GC.SuppressFinalize(this); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Hooking/WindowsTitleMonitor.cs b/src/Greenshot.Base/Hooking/WindowsTitleMonitor.cs deleted file mode 100644 index f93542228..000000000 --- a/src/Greenshot.Base/Hooking/WindowsTitleMonitor.cs +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using Greenshot.Base.Core; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.Hooking -{ - /// - /// Event arguments for the TitleChangeEvent - /// - public class TitleChangeEventArgs : EventArgs - { - /// - /// HWnd of the window which has a changed title - /// - public IntPtr HWnd { get; set; } - - /// - /// Title which is changed - /// - public string Title { get; set; } - } - - /// - /// Delegate for the title change event - /// - /// - public delegate void TitleChangeEventDelegate(TitleChangeEventArgs eventArgs); - - /// - /// Monitor all title changes - /// - public sealed class WindowsTitleMonitor : IDisposable - { - private WindowsEventHook _hook; - private readonly object _lockObject = new object(); - - // ReSharper disable once InconsistentNaming - private event TitleChangeEventDelegate _titleChangeEvent; - - /// - /// Add / remove event handler to the title monitor - /// - public event TitleChangeEventDelegate TitleChangeEvent - { - add - { - lock (_lockObject) - { - if (_hook == null) - { - _hook = new WindowsEventHook(); - _hook.Hook(WinEvent.EVENT_OBJECT_NAMECHANGE, WinEventHandler); - } - - _titleChangeEvent += value; - } - } - remove - { - lock (_lockObject) - { - _titleChangeEvent -= value; - if (_titleChangeEvent == null || _titleChangeEvent.GetInvocationList().Length == 0) - { - if (_hook != null) - { - _hook.Dispose(); - _hook = null; - } - } - } - } - } - - /// - /// WinEventDelegate for the creation & destruction - /// - /// - /// - /// - /// - /// - /// - private void WinEventHandler(WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime) - { - if (hWnd == IntPtr.Zero || idObject != EventObjects.OBJID_WINDOW) - { - return; - } - - if (eventType == WinEvent.EVENT_OBJECT_NAMECHANGE) - { - if (_titleChangeEvent != null) - { - string newTitle = new WindowDetails(hWnd).Text; - _titleChangeEvent(new TitleChangeEventArgs - { - HWnd = hWnd, - Title = newTitle - }); - } - } - } - - private bool _disposedValue; // To detect redundant calls - - /// - /// Dispose the underlying hook - /// - public void Dispose(bool disposing) - { - if (_disposedValue) - { - return; - } - - lock (_lockObject) - { - _hook?.Dispose(); - } - - _disposedValue = true; - } - - /// - /// Make sure the finalizer disposes the underlying hook - /// - ~WindowsTitleMonitor() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(false); - } - - /// - /// Dispose the underlying hook - /// - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - GC.SuppressFinalize(this); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs b/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs index 624c156b1..1894eb647 100644 --- a/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs @@ -22,6 +22,7 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Interfaces.Drawing.Adorners { @@ -35,7 +36,7 @@ namespace Greenshot.Base.Interfaces.Drawing.Adorners /// /// These are the bounds of the adorner /// - Rectangle Bounds { get; } + NativeRect Bounds { get; } /// /// The current edit status, this is needed to locate the adorner to send events to @@ -53,7 +54,7 @@ namespace Greenshot.Base.Interfaces.Drawing.Adorners /// /// Point to test /// true if so - bool HitTest(Point point); + bool HitTest(NativePoint point); /// /// Handle the MouseDown event @@ -97,6 +98,21 @@ namespace Greenshot.Base.Interfaces.Drawing.Adorners /// Adjust UI elements to the supplied DPI settings /// /// - void AdjustToDpi(uint dpi); + void AdjustToDpi(int dpi); + + /// + /// The color of the lines around the adorner + /// + Color OutlineColor { get; set; } + + /// + /// The color of the fill of the adorner + /// + Color FillColor { get; set; } + + /// + /// This is to TAG the adorner so we know the type + /// + string Tag { get; set; } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/EditStatus.cs b/src/Greenshot.Base/Interfaces/Drawing/EditStatus.cs new file mode 100644 index 000000000..60f2c2af1 --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Drawing/EditStatus.cs @@ -0,0 +1,32 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace Greenshot.Base.Interfaces.Drawing +{ + public enum EditStatus + { + UNDRAWN, + DRAWING, + MOVING, + RESIZING, + IDLE + }; +} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/CursorInfo.cs b/src/Greenshot.Base/Interfaces/Drawing/ICursorContainer.cs similarity index 76% rename from src/Greenshot.Base/UnmanagedHelpers/Structs/CursorInfo.cs rename to src/Greenshot.Base/Interfaces/Drawing/ICursorContainer.cs index 219a634f6..4051203c5 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/CursorInfo.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/ICursorContainer.cs @@ -19,17 +19,13 @@ * along with this program. If not, see . */ -using System; -using System.Runtime.InteropServices; +using System.Windows.Forms; -namespace Greenshot.Base.UnmanagedHelpers.Structs +namespace Greenshot.Base.Interfaces.Drawing { - [StructLayout(LayoutKind.Sequential)] - public struct CursorInfo + public interface ICursorContainer : IDrawableContainer { - public int cbSize; - public int flags; - public IntPtr hCursor; - public POINT ptScreenPos; + Cursor Cursor { get; set; } + void Load(string filename); } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/IDrawableContainer.cs b/src/Greenshot.Base/Interfaces/Drawing/IDrawableContainer.cs new file mode 100644 index 000000000..80e2bd140 --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Drawing/IDrawableContainer.cs @@ -0,0 +1,115 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces.Drawing.Adorners; + +namespace Greenshot.Base.Interfaces.Drawing +{ + public interface IDrawableContainer : INotifyPropertyChanged, IDisposable + { + /// + /// The parent surface where this IDrawableContainer is on + /// + ISurface Parent { get; set; } + + /// + /// Is this IDrawableContainer selected on the surface + /// + bool Selected { get; set; } + + int Left { get; set; } + + int Top { get; set; } + + int Width { get; set; } + + int Height { get; set; } + + NativePoint Location { get; } + + NativeSize Size { get; } + + NativeRect Bounds { get; } + + NativeRect DrawingBounds { get; } + + void ApplyBounds(NativeRectFloat newBounds); + + bool HasFilters { get; } + + EditStatus Status { get; set; } + + void Invalidate(); + + bool ClickableAt(int x, int y); + + void MoveBy(int x, int y); + + void Transform(Matrix matrix); + + bool HandleMouseDown(int x, int y); + + void HandleMouseUp(int x, int y); + + bool HandleMouseMove(int x, int y); + + bool InitContent(); + + /// + /// Defines if the drawable container participates in undo / redo + /// + bool IsUndoable { get; } + + void MakeBoundsChangeUndoable(bool allowMerge); + + EditStatus DefaultEditMode { get; } + + /// + /// Available adorners for the DrawableContainer + /// + IList Adorners { get; } + + /// + /// Is confirm/cancel possible for this container + /// + bool IsConfirmable { get; } + + /// + /// Adjust UI elements to the supplied DPI settings + /// + /// int + void AdjustToDpi(int dpi); + + /// + /// Enable a way for elements to add a context menu entry + /// + /// ContextMenuStrip + /// ISurface + /// MouseEventArgs + void AddContextMenuItems(ContextMenuStrip menu, ISurface surface, MouseEventArgs mouseEventArgs); + } +} \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/Container.cs b/src/Greenshot.Base/Interfaces/Drawing/IDrawableContainerList.cs similarity index 50% rename from src/Greenshot.Base/Interfaces/Drawing/Container.cs rename to src/Greenshot.Base/Interfaces/Drawing/IDrawableContainerList.cs index 4f653ac8a..795c36afe 100644 --- a/src/Greenshot.Base/Interfaces/Drawing/Container.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/IDrawableContainerList.cs @@ -21,78 +21,13 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; -using Greenshot.Base.Interfaces.Drawing.Adorners; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Interfaces.Drawing { - public enum RenderMode - { - EDIT, - EXPORT - }; - - public enum EditStatus - { - UNDRAWN, - DRAWING, - MOVING, - RESIZING, - IDLE - }; - - public interface IDrawableContainer : INotifyPropertyChanged, IDisposable - { - ISurface Parent { get; set; } - bool Selected { get; set; } - - int Left { get; set; } - - int Top { get; set; } - - int Width { get; set; } - - int Height { get; set; } - - Point Location { get; } - - Size Size { get; } - - Rectangle Bounds { get; } - - Rectangle DrawingBounds { get; } - - void ApplyBounds(RectangleF newBounds); - - bool hasFilters { get; } - - EditStatus Status { get; set; } - void Invalidate(); - bool ClickableAt(int x, int y); - void MoveBy(int x, int y); - void Transform(Matrix matrix); - bool HandleMouseDown(int x, int y); - void HandleMouseUp(int x, int y); - bool HandleMouseMove(int x, int y); - bool InitContent(); - void MakeBoundsChangeUndoable(bool allowMerge); - EditStatus DefaultEditMode { get; } - - /// - /// Available adorners for the DrawableContainer - /// - IList Adorners { get; } - - /// - /// Adjust UI elements to the supplied DPI settings - /// - /// uint - void AdjustToDpi(uint dpi); - } - public interface IDrawableContainerList : IList, IDisposable { Guid ParentID { get; } @@ -101,16 +36,16 @@ namespace Greenshot.Base.Interfaces.Drawing ISurface Parent { get; set; } EditStatus Status { get; set; } - Rectangle DrawingBounds { get; } + NativeRect DrawingBounds { get; } void MakeBoundsChangeUndoable(bool allowMerge); void Transform(Matrix matrix); void MoveBy(int dx, int dy); bool ClickableAt(int x, int y); IDrawableContainer ClickableElementAt(int x, int y); void OnDoubleClick(); - bool HasIntersectingFilters(Rectangle clipRectangle); - bool IntersectsWith(Rectangle clipRectangle); - void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, Rectangle clipRectangle); + bool HasIntersectingFilters(NativeRect clipRectangle); + bool IntersectsWith(NativeRect clipRectangle); + void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, NativeRect clipRectangle); void SetForegroundColor(Color color); void SetBackgroundColor(Color color); int IncreaseLineThickness(int increaseBy); @@ -124,30 +59,6 @@ namespace Greenshot.Base.Interfaces.Drawing void PushElementsToBottom(IDrawableContainerList elements); void ShowContextMenu(MouseEventArgs e, ISurface surface); void HandleFieldChangedEvent(object sender, FieldChangedEventArgs e); - void AdjustToDpi(uint dpi); - } - - public interface ITextContainer : IDrawableContainer - { - string Text { get; set; } - void FitToText(); - } - - public interface IImageContainer : IDrawableContainer - { - Image Image { get; set; } - void Load(string filename); - } - - public interface ICursorContainer : IDrawableContainer - { - Cursor Cursor { get; set; } - void Load(string filename); - } - - public interface IIconContainer : IDrawableContainer - { - Icon Icon { get; set; } - void Load(string filename); + void AdjustToDpi(int dpi); } } \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/EventObjects.cs b/src/Greenshot.Base/Interfaces/Drawing/IFieldAggregator.cs similarity index 69% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/EventObjects.cs rename to src/Greenshot.Base/Interfaces/Drawing/IFieldAggregator.cs index c9bf33cfc..5af83b39e 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/EventObjects.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/IFieldAggregator.cs @@ -19,16 +19,18 @@ * along with this program. If not, see . */ -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Base.Interfaces.Drawing { /// - /// See Object Identifiers + /// The IFieldAggregator defines the connections between fields and containers /// - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum EventObjects + public interface IFieldAggregator { - OBJID_WINDOW = 0 + void UnbindElement(IDrawableContainer dc); + void BindElements(IDrawableContainerList dcs); + void BindElement(IDrawableContainer dc); + IField GetField(IFieldType fieldType); + + event FieldChangedEventHandler FieldChanged; } -} \ No newline at end of file +} diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/ProcessAccessFlags.cs b/src/Greenshot.Base/Interfaces/Drawing/IIconContainer.cs similarity index 75% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/ProcessAccessFlags.cs rename to src/Greenshot.Base/Interfaces/Drawing/IIconContainer.cs index c8795e33c..886dcf35c 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/ProcessAccessFlags.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/IIconContainer.cs @@ -1,34 +1,31 @@ /* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * + * * For more information see: https://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * 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 General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -using System; -using System.Diagnostics.CodeAnalysis; +using System.Drawing; -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Base.Interfaces.Drawing { - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum ProcessAccessFlags : uint + public interface IIconContainer : IDrawableContainer { - VMRead = 0x00000010, - QueryInformation = 0x00000400, + Icon Icon { get; set; } + void Load(string filename); } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/IImageContainer.cs b/src/Greenshot.Base/Interfaces/Drawing/IImageContainer.cs new file mode 100644 index 000000000..a16379dce --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Drawing/IImageContainer.cs @@ -0,0 +1,31 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Drawing; + +namespace Greenshot.Base.Interfaces.Drawing +{ + public interface IImageContainer : IDrawableContainer + { + Image Image { get; set; } + void Load(string filename); + } +} \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/ITextContainer.cs b/src/Greenshot.Base/Interfaces/Drawing/ITextContainer.cs new file mode 100644 index 000000000..ff5c84c43 --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Drawing/ITextContainer.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace Greenshot.Base.Interfaces.Drawing +{ + public interface ITextContainer : IDrawableContainer + { + string Text { get; set; } + void FitToText(); + } +} \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Drawing/RenderMode.cs b/src/Greenshot.Base/Interfaces/Drawing/RenderMode.cs new file mode 100644 index 000000000..c0b1dd99a --- /dev/null +++ b/src/Greenshot.Base/Interfaces/Drawing/RenderMode.cs @@ -0,0 +1,29 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace Greenshot.Base.Interfaces.Drawing +{ + public enum RenderMode + { + EDIT, + EXPORT + } +} \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/ICapture.cs b/src/Greenshot.Base/Interfaces/ICapture.cs index 6e4fc31b2..d1c8881a8 100644 --- a/src/Greenshot.Base/Interfaces/ICapture.cs +++ b/src/Greenshot.Base/Interfaces/ICapture.cs @@ -21,6 +21,7 @@ using System; using System.Drawing; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Interfaces { @@ -47,7 +48,7 @@ namespace Greenshot.Base.Interfaces /// /// Bounds on the screen from which the capture comes /// - Rectangle ScreenBounds { get; set; } + NativeRect ScreenBounds { get; set; } /// /// The cursor @@ -62,18 +63,18 @@ namespace Greenshot.Base.Interfaces /// /// Location of the cursor /// - Point CursorLocation { get; set; } + NativePoint CursorLocation { get; set; } /// /// Location of the capture /// - Point Location { get; set; } + NativePoint Location { get; set; } /// /// Crops the capture to the specified rectangle (with Bitmap coordinates!) /// - /// Rectangle with bitmap coordinates - bool Crop(Rectangle cropRectangle); + /// NativeRect with bitmap coordinates + bool Crop(NativeRect cropRectangle); /// /// Apply a translate to the mouse location. e.g. needed for crop diff --git a/src/Greenshot.Base/Interfaces/IFileFormatHandler.cs b/src/Greenshot.Base/Interfaces/IFileFormatHandler.cs new file mode 100644 index 000000000..bd5558857 --- /dev/null +++ b/src/Greenshot.Base/Interfaces/IFileFormatHandler.cs @@ -0,0 +1,88 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Base.Interfaces.Plugin; + +namespace Greenshot.Base.Interfaces +{ + /// + /// The possible actions a IFileFormatHandler might support + /// + public enum FileFormatHandlerActions + { + SaveToStream, + LoadFromStream, + LoadDrawableFromStream + } + + /// + /// This interface is for code to implement the loading and saving of certain file formats + /// + public interface IFileFormatHandler + { + /// + /// Registry for all the extensions this IFileFormatHandler support + /// + IDictionary> SupportedExtensions { get; } + + /// + /// Priority (from high int.MinValue, low int.MaxValue) of this IFileFormatHandler for the specified action and extension + /// This should be used to sort the possible IFileFormatHandler + /// + /// FileFormatHandlerActions + /// string + /// int specifying the priority for the action and extension + public int PriorityFor(FileFormatHandlerActions fileFormatHandlerAction, string extension); + + /// + /// Try to save the specified bitmap to the stream in the format belonging to the extension + /// + /// Bitmap + /// Stream + /// extension + /// ISurface with the elements for those file types which can store a surface (.greenshot) + /// SurfaceOutputSettings + /// bool true if it was successful + public bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null); + + /// + /// + /// + /// + /// + /// + /// bool true if it was successful + public bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap); + + /// + /// Try to load a drawable container from the stream + /// + /// Stream + /// string + /// ISurface + /// IEnumerable{IDrawableContainer} + public IEnumerable LoadDrawablesFromStream(Stream stream, string extension, ISurface parentSurface = null); + } +} diff --git a/src/Greenshot.Base/UnmanagedHelpers/EnumWindowsProc.cs b/src/Greenshot.Base/Interfaces/IProvideDeviceDpi.cs similarity index 76% rename from src/Greenshot.Base/UnmanagedHelpers/EnumWindowsProc.cs rename to src/Greenshot.Base/Interfaces/IProvideDeviceDpi.cs index 9d5b10b92..73db77af6 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/EnumWindowsProc.cs +++ b/src/Greenshot.Base/Interfaces/IProvideDeviceDpi.cs @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * @@ -19,15 +19,16 @@ * along with this program. If not, see . */ -using System; - -namespace Greenshot.Base.UnmanagedHelpers +namespace Greenshot.Base.Interfaces { /// - /// Used with EnumWindows or EnumChildWindows + /// IProvideDeviceDpi can provide the current DPI for a component /// - /// IntPtr - /// int - /// int - public delegate int EnumWindowsProc(IntPtr hWnd, int lParam); + public interface IProvideDeviceDpi + { + /// + /// A simple getter for the current DPI + /// + int DeviceDpi { get; } + } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/IServiceLocator.cs b/src/Greenshot.Base/Interfaces/IServiceLocator.cs index c22e3463b..5cf1fb529 100644 --- a/src/Greenshot.Base/Interfaces/IServiceLocator.cs +++ b/src/Greenshot.Base/Interfaces/IServiceLocator.cs @@ -32,7 +32,7 @@ namespace Greenshot.Base.Interfaces /// /// Service to find /// IEnumerable{TService} - IEnumerable GetAllInstances(); + IReadOnlyList GetAllInstances(); /// /// Get the only instance of the specified service diff --git a/src/Greenshot.Base/Interfaces/ISurface.cs b/src/Greenshot.Base/Interfaces/ISurface.cs index d5df7ff44..4b39fb9b8 100644 --- a/src/Greenshot.Base/Interfaces/ISurface.cs +++ b/src/Greenshot.Base/Interfaces/ISurface.cs @@ -21,8 +21,10 @@ using System; using System.Drawing; +using System.Drawing.Drawing2D; using System.IO; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Effects; using Greenshot.Base.Interfaces.Drawing; @@ -100,13 +102,49 @@ namespace Greenshot.Base.Interfaces long SaveElementsToStream(Stream stream); void LoadElementsFromStream(Stream stream); + /// + /// Provides the selected elements + /// + IDrawableContainerList SelectedElements { get; } + + /// + /// Is there an element selected on the surface? + /// bool HasSelectedElements { get; } + + /// + /// Remove all selected elements + /// void RemoveSelectedElements(); + + /// + /// Cut the selected elements to the clipboard + /// void CutSelectedElements(); + + /// + /// Copy the selected elements to the clipboard + /// void CopySelectedElements(); + + /// + /// Paste the elements from the clipboard + /// void PasteElementFromClipboard(); + + /// + /// Duplicate the selected elements + /// void DuplicateSelectedElements(); + + /// + /// Deselected the specified element + /// void DeselectElement(IDrawableContainer container, bool generateEvents = true); + + /// + /// Deselected all elements + /// void DeselectAllElements(); /// @@ -148,8 +186,8 @@ namespace Greenshot.Base.Interfaces /// Invalidates the specified region of the Surface. /// Takes care of the Surface zoom level, accepts rectangle in the coordinate space of the Image. /// - /// Bounding rectangle for updated elements, in the coordinate space of the Image. - void InvalidateElements(Rectangle rectangleToInvalidate); + /// NativeRect Bounding rectangle for updated elements, in the coordinate space of the Image. + void InvalidateElements(NativeRect rectangleToInvalidate); bool Modified { get; set; } string LastSaveFullPath { get; set; } @@ -177,29 +215,54 @@ namespace Greenshot.Base.Interfaces Fraction ZoomFactor { get; set; } /// - /// Translate a point from image coorditate space to surface coordinate space. + /// Translate a point from image coordinate space to surface coordinate space. /// /// A point in the coordinate space of the image. - Point ToSurfaceCoordinates(Point point); + NativePoint ToSurfaceCoordinates(NativePoint point); /// - /// Translate a rectangle from image coorditate space to surface coordinate space. + /// Translate a rectangle from image coordinate space to surface coordinate space. /// - /// A rectangle in the coordinate space of the image. - Rectangle ToSurfaceCoordinates(Rectangle rc); + /// NativeRect in the coordinate space of the image. + NativeRect ToSurfaceCoordinates(NativeRect rc); /// - /// Translate a point from surface coorditate space to image coordinate space. + /// Translate a point from surface coordinate space to image coordinate space. /// - /// A point in the coordinate space of the surface. - Point ToImageCoordinates(Point point); + /// NativePoint in the coordinate space of the surface. + NativePoint ToImageCoordinates(NativePoint point); /// - /// Translate a rectangle from surface coorditate space to image coordinate space. + /// Translate a NativeRect from surface coordinate space to image coordinate space. /// - /// A rectangle in the coordinate space of the surface. - Rectangle ToImageCoordinates(Rectangle rc); + /// NativeRect in the coordinate space of the surface. + NativeRect ToImageCoordinates(NativeRect rc); + /// + /// Make it possible to undo the specified IMemento + /// + /// IMemento + /// bool to specify if the action can be merged, e.g. we do not want an undo for every part of a resize void MakeUndoable(IMemento memento, bool allowMerge); + + /// + /// The IFieldAggregator + /// + IFieldAggregator FieldAggregator { get; } + + /// + /// This reverses a change of the background image + /// + /// Image + /// Matrix + void UndoBackgroundChange(Image previous, Matrix matrix); + + /// + /// The most recent DPI value that was used + /// + public int CurrentDpi + { + get; + } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Ocr/Line.cs b/src/Greenshot.Base/Interfaces/Ocr/Line.cs index fc21f72ae..ff5914a4e 100644 --- a/src/Greenshot.Base/Interfaces/Ocr/Line.cs +++ b/src/Greenshot.Base/Interfaces/Ocr/Line.cs @@ -1,4 +1,26 @@ -using System.Drawing; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Interfaces.Ocr { @@ -7,7 +29,7 @@ namespace Greenshot.Base.Interfaces.Ocr /// public class Line { - private Rectangle? _calculatedBounds; + private NativeRect? _calculatedBounds; /// /// Constructor will preallocate the number of words @@ -35,18 +57,18 @@ namespace Greenshot.Base.Interfaces.Ocr /// /// Calculate the bounds of the words /// - /// Rectangle - private Rectangle CalculateBounds() + /// NativeRect + private NativeRect CalculateBounds() { if (Words.Length == 0) { - return Rectangle.Empty; + return NativeRect.Empty; } var result = Words[0].Bounds; for (var index = 0; index < Words.Length; index++) { - result = Rectangle.Union(result, Words[index].Bounds); + result = result.Union(Words[index].Bounds); } return result; @@ -55,7 +77,7 @@ namespace Greenshot.Base.Interfaces.Ocr /// /// Return the calculated bounds for the whole line /// - public Rectangle CalculatedBounds + public NativeRect CalculatedBounds { get { return _calculatedBounds ??= CalculateBounds(); } } @@ -69,9 +91,7 @@ namespace Greenshot.Base.Interfaces.Ocr { foreach (var word in Words) { - var location = word.Bounds; - location.Offset(x, y); - word.Bounds = location; + word.Bounds = word.Bounds.Offset(x, y); } _calculatedBounds = null; diff --git a/src/Greenshot.Base/Interfaces/Ocr/OcrInformation.cs b/src/Greenshot.Base/Interfaces/Ocr/OcrInformation.cs index d7cb82559..216265099 100644 --- a/src/Greenshot.Base/Interfaces/Ocr/OcrInformation.cs +++ b/src/Greenshot.Base/Interfaces/Ocr/OcrInformation.cs @@ -1,4 +1,25 @@ -using System.Collections.Generic; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/src/Greenshot.Base/Interfaces/Ocr/Word.cs b/src/Greenshot.Base/Interfaces/Ocr/Word.cs index 467b5278b..0e6920f40 100644 --- a/src/Greenshot.Base/Interfaces/Ocr/Word.cs +++ b/src/Greenshot.Base/Interfaces/Ocr/Word.cs @@ -1,4 +1,25 @@ -using System.Drawing; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using Dapplo.Windows.Common.Structs; namespace Greenshot.Base.Interfaces.Ocr { @@ -15,6 +36,6 @@ namespace Greenshot.Base.Interfaces.Ocr /// /// The bounds of the word /// - public Rectangle Bounds { get; set; } + public NativeRect Bounds { get; set; } } } \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/DeviceCaps.cs b/src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs similarity index 58% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/DeviceCaps.cs rename to src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs index 2f2df7994..2be14c7a8 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/DeviceCaps.cs +++ b/src/Greenshot.Base/Interfaces/Plugin/AssemblyPluginIdentifierAttribute.cs @@ -1,6 +1,6 @@ -/* +/* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: https://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -19,25 +19,28 @@ * along with this program. If not, see . */ -using System.Diagnostics.CodeAnalysis; +using System; -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Base.Interfaces.Plugin { /// - /// Used by GDI32.GetDeviceCaps - /// See GetDeviceCaps + /// Attribute to specify a custom plugin identifier at assembly level /// - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum DeviceCaps + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] + public class AssemblyPluginIdentifierAttribute : Attribute { /// - /// Logical pixels inch in X + /// The identifier used for the plugin in configuration /// - LOGPIXELSX = 88, + public string Identifier { get; } /// - /// Current vertical refresh rate of the display device (for displays only) in Hz + /// Constructor for the plugin identifier attribute /// - VREFRESH = 116 + /// The identifier for the plugin in configuration + public AssemblyPluginIdentifierAttribute(string identifier) + { + Identifier = identifier; + } } } \ No newline at end of file diff --git a/src/Greenshot.Base/Interfaces/Plugin/SurfaceOutputSettings.cs b/src/Greenshot.Base/Interfaces/Plugin/SurfaceOutputSettings.cs index ef2a58e2f..efce47bbb 100644 --- a/src/Greenshot.Base/Interfaces/Plugin/SurfaceOutputSettings.cs +++ b/src/Greenshot.Base/Interfaces/Plugin/SurfaceOutputSettings.cs @@ -1,4 +1,25 @@ -using System.Collections.Generic; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.Effects; diff --git a/src/Greenshot.Base/Interfaces/SurfaceLineThicknessEventArgs.cs b/src/Greenshot.Base/Interfaces/SurfaceLineThicknessEventArgs.cs index 5fd5694ba..61ac1a848 100644 --- a/src/Greenshot.Base/Interfaces/SurfaceLineThicknessEventArgs.cs +++ b/src/Greenshot.Base/Interfaces/SurfaceLineThicknessEventArgs.cs @@ -20,7 +20,6 @@ */ using System; -using System.Drawing; namespace Greenshot.Base.Interfaces { diff --git a/src/Greenshot.Base/Interfaces/SurfaceShadowEventArgs.cs b/src/Greenshot.Base/Interfaces/SurfaceShadowEventArgs.cs index a7bd682b7..5159d4d05 100644 --- a/src/Greenshot.Base/Interfaces/SurfaceShadowEventArgs.cs +++ b/src/Greenshot.Base/Interfaces/SurfaceShadowEventArgs.cs @@ -20,7 +20,6 @@ */ using System; -using System.Drawing; namespace Greenshot.Base.Interfaces { diff --git a/src/Greenshot.Base/UnmanagedHelpers/DWM.cs b/src/Greenshot.Base/UnmanagedHelpers/DWM.cs deleted file mode 100644 index 5a2b59d87..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/DWM.cs +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using Greenshot.Base.Core; -using Greenshot.Base.Core.Enums; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; -using Microsoft.Win32; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Desktop Window Manager helper code - /// - public static class DWM - { - // DWM - [DllImport("dwmapi", SetLastError = true)] - public static extern int DwmRegisterThumbnail(IntPtr dest, IntPtr src, out IntPtr thumb); - - [DllImport("dwmapi", SetLastError = true)] - public static extern int DwmUnregisterThumbnail(IntPtr thumb); - - [DllImport("dwmapi", SetLastError = true)] - public static extern HResult DwmQueryThumbnailSourceSize(IntPtr thumb, out SIZE size); - - [DllImport("dwmapi", SetLastError = true)] - public static extern HResult DwmUpdateThumbnailProperties(IntPtr hThumb, ref DWM_THUMBNAIL_PROPERTIES props); - - // Deprecated as of Windows 8 Release Preview - [DllImport("dwmapi", SetLastError = true)] - public static extern int DwmIsCompositionEnabled(out bool enabled); - - [DllImport("dwmapi", SetLastError = true)] - public static extern int DwmGetWindowAttribute(IntPtr hWnd, DWMWINDOWATTRIBUTE dwAttribute, out RECT lpRect, int size); - - [DllImport("dwmapi", SetLastError = true)] - public static extern int DwmGetWindowAttribute(IntPtr hWnd, DWMWINDOWATTRIBUTE dwAttribute, out bool pvAttribute, int cbAttribute); - - // Key to ColorizationColor for DWM - private const string COLORIZATION_COLOR_KEY = @"SOFTWARE\Microsoft\Windows\DWM"; - - /// - /// Checks if the window is cloaked, this should solve some issues with the window selection code - /// - /// IntPtr as hWmd - /// bool - public static bool IsWindowCloaked(IntPtr hWnd) - { - if (!WindowsVersion.IsWindows8OrLater) - { - return false; - } - - DwmGetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_CLOAKED, out bool isCloaked, Marshal.SizeOf(typeof(bool))); - return isCloaked; - } - - /// - /// Helper method for an easy DWM check - /// - /// bool true if DWM is available AND active - public static bool IsDwmEnabled - { - get - { - // According to: https://technet.microsoft.com/en-us/subscriptions/aa969538%28v=vs.85%29.aspx - // And: https://docs.microsoft.com/en-gb/windows/win32/api/dwmapi/nf-dwmapi-dwmenablecomposition - // DMW is always enabled on Windows 8! So return true and save a check! ;-) - if (WindowsVersion.IsWindows8OrLater) - { - return true; - } - - if (WindowsVersion.IsWindowsVistaOrLater) - { - DwmIsCompositionEnabled(out var dwmEnabled); - return dwmEnabled; - } - - return false; - } - } - - public static Color ColorizationColor - { - get - { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(COLORIZATION_COLOR_KEY, false)) - { - object dwordValue = key?.GetValue("ColorizationColor"); - if (dwordValue != null) - { - return Color.FromArgb((int) dwordValue); - } - } - - return Color.White; - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/ClassLongIndex.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/ClassLongIndex.cs deleted file mode 100644 index 76676d157..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/ClassLongIndex.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum ClassLongIndex - { - GCL_HICON = -14, // a handle to the icon associated with the class. - GCL_HICONSM = -34, // a handle to the small icon associated with the class. - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/DWMWINDOWATTRIBUTE.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/DWMWINDOWATTRIBUTE.cs deleted file mode 100644 index 5b6ee9900..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/DWMWINDOWATTRIBUTE.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum DWMWINDOWATTRIBUTE : uint - { - DWMWA_NCRENDERING_ENABLED = 1, - DWMWA_NCRENDERING_POLICY, - DWMWA_TRANSITIONS_FORCEDISABLED, - DWMWA_ALLOW_NCPAINT, - DWMWA_CAPTION_BUTTON_BOUNDS, - DWMWA_NONCLIENT_RTL_LAYOUT, - DWMWA_FORCE_ICONIC_REPRESENTATION, - DWMWA_FLIP3D_POLICY, - DWMWA_EXTENDED_FRAME_BOUNDS, // This is the one we need for retrieving the Window size since Windows Vista - DWMWA_HAS_ICONIC_BITMAP, // Since Windows 7 - DWMWA_DISALLOW_PEEK, // Since Windows 7 - DWMWA_EXCLUDED_FROM_PEEK, // Since Windows 7 - DWMWA_CLOAK, // Since Windows 8 - DWMWA_CLOAKED, // Since Windows 8 - DWMWA_FREEZE_REPRESENTATION, // Since Windows 8 - DWMWA_LAST - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/DWM_THUMBNAIL_PROPERTIES.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/DWM_THUMBNAIL_PROPERTIES.cs deleted file mode 100644 index 615c2d7fa..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/DWM_THUMBNAIL_PROPERTIES.cs +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Runtime.InteropServices; -using Greenshot.Base.UnmanagedHelpers.Structs; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// See DWM_THUMBNAIL_PROPERTIES - /// - [StructLayout(LayoutKind.Sequential)] - public struct DWM_THUMBNAIL_PROPERTIES - { - // A bitwise combination of DWM thumbnail constant values that indicates which members of this structure are set. - public int dwFlags; - - // The area in the destination window where the thumbnail will be rendered. - public RECT rcDestination; - - // The region of the source window to use as the thumbnail. By default, the entire window is used as the thumbnail. - public RECT rcSource; - - // The opacity with which to render the thumbnail. 0 is fully transparent while 255 is fully opaque. The default value is 255. - public byte opacity; - - // TRUE to make the thumbnail visible; otherwise, FALSE. The default is FALSE. - public bool fVisible; - - // TRUE to use only the thumbnail source's client area; otherwise, FALSE. The default is FALSE. - public bool fSourceClientAreaOnly; - - public RECT Destination - { - set - { - dwFlags |= DWM_TNP_RECTDESTINATION; - rcDestination = value; - } - } - - public RECT Source - { - set - { - dwFlags |= DWM_TNP_RECTSOURCE; - rcSource = value; - } - } - - public byte Opacity - { - set - { - dwFlags |= DWM_TNP_OPACITY; - opacity = value; - } - } - - public bool Visible - { - set - { - dwFlags |= DWM_TNP_VISIBLE; - fVisible = value; - } - } - - public bool SourceClientAreaOnly - { - set - { - dwFlags |= DWM_TNP_SOURCECLIENTAREAONLY; - fSourceClientAreaOnly = value; - } - } - - // A value for the rcDestination member has been specified. - public const int DWM_TNP_RECTDESTINATION = 0x00000001; - - // A value for the rcSource member has been specified. - public const int DWM_TNP_RECTSOURCE = 0x00000002; - - // A value for the opacity member has been specified. - public const int DWM_TNP_OPACITY = 0x00000004; - - // A value for the fVisible member has been specified. - public const int DWM_TNP_VISIBLE = 0x00000008; - - // A value for the fSourceClientAreaOnly member has been specified. - public const int DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010; - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/DesktopAccessRight.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/DesktopAccessRight.cs deleted file mode 100644 index c99ddb149..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/DesktopAccessRight.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum DesktopAccessRight : uint - { - DESKTOP_READOBJECTS = 0x00000001, - DESKTOP_CREATEWINDOW = 0x00000002, - DESKTOP_CREATEMENU = 0x00000004, - DESKTOP_HOOKCONTROL = 0x00000008, - DESKTOP_JOURNALRECORD = 0x00000010, - DESKTOP_JOURNALPLAYBACK = 0x00000020, - DESKTOP_ENUMERATE = 0x00000040, - DESKTOP_WRITEOBJECTS = 0x00000080, - DESKTOP_SWITCHDESKTOP = 0x00000100, - - GENERIC_ALL = (DESKTOP_READOBJECTS | DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU | - DESKTOP_HOOKCONTROL | DESKTOP_JOURNALRECORD | DESKTOP_JOURNALPLAYBACK | - DESKTOP_ENUMERATE | DESKTOP_WRITEOBJECTS | DESKTOP_SWITCHDESKTOP) - }; -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/ExtendedWindowStyleFlags.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/ExtendedWindowStyleFlags.cs deleted file mode 100644 index aaeb23fa9..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/ExtendedWindowStyleFlags.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum ExtendedWindowStyleFlags : uint - { - WS_EX_DLGMODALFRAME = 0x00000001, - WS_EX_NOPARENTNOTIFY = 0x00000004, - WS_EX_TOPMOST = 0x00000008, - WS_EX_ACCEPTFILES = 0x00000010, - WS_EX_TRANSPARENT = 0x00000020, - - //#if(WINVER >= 0x0400) - WS_EX_MDICHILD = 0x00000040, - WS_EX_TOOLWINDOW = 0x00000080, - WS_EX_WINDOWEDGE = 0x00000100, - WS_EX_CLIENTEDGE = 0x00000200, - WS_EX_CONTEXTHELP = 0x00000400, - - WS_EX_RIGHT = 0x00001000, - WS_EX_LEFT = 0x00000000, - WS_EX_RTLREADING = 0x00002000, - WS_EX_LTRREADING = 0x00000000, - WS_EX_LEFTSCROLLBAR = 0x00004000, - WS_EX_RIGHTSCROLLBAR = 0x00000000, - - WS_EX_CONTROLPARENT = 0x00010000, - WS_EX_STATICEDGE = 0x00020000, - WS_EX_APPWINDOW = 0x00040000, - - //WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE), - //WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST), - - WS_EX_LAYERED = 0x00080000, - WS_EX_NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children - WS_EX_NOREDIRECTIONBITMAP = 0x00200000, //The window does not render to a redirection surface. This is for windows that do not have visible content or that use mechanisms other than surfaces to provide their visual. - WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring - /// - /// Paints all descendants of a window in bottom-to-top painting order using double-buffering. - /// Bottom-to-top painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the descendent window also has the WS_EX_TRANSPARENT bit set. - /// Double-buffering allows the window and its descendents to be painted without flicker. - /// This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC. - /// - WS_EX_COMPOSITED = 0x02000000, - WS_EX_NOACTIVATE = 0x08000000 // A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window. - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/ShowWindowCommand.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/ShowWindowCommand.cs deleted file mode 100644 index 5faf95e03..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/ShowWindowCommand.cs +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum ShowWindowCommand : uint - { - /// - /// Hides the window and activates another window. - /// - Hide = 0, - - /// - /// Activates and displays a window. If the window is minimized or - /// maximized, the system restores it to its original size and position. - /// An application should specify this flag when displaying the window - /// for the first time. - /// - Normal = 1, - - /// - /// Activates the window and displays it as a minimized window. - /// - ShowMinimized = 2, - - /// - /// Maximizes the specified window. - /// - Maximize = 3, // is this the right value? - - /// - /// Activates the window and displays it as a maximized window. - /// - ShowMaximized = 3, - - /// - /// Displays a window in its most recent size and position. This value - /// is similar to , except - /// the window is not actived. - /// - ShowNoActivate = 4, - - /// - /// Activates the window and displays it in its current size and position. - /// - Show = 5, - - /// - /// Minimizes the specified window and activates the next top-level - /// window in the Z order. - /// - Minimize = 6, - - /// - /// Displays the window as a minimized window. This value is similar to - /// , except the - /// window is not activated. - /// - ShowMinNoActive = 7, - - /// - /// Displays the window in its current size and position. This value is - /// similar to , except the - /// window is not activated. - /// - ShowNA = 8, - - /// - /// Activates and displays the window. If the window is minimized or - /// maximized, the system restores it to its original size and position. - /// An application should specify this flag when restoring a minimized window. - /// - Restore = 9, - - /// - /// Sets the show state based on the SW_* value specified in the - /// STARTUPINFO structure passed to the CreateProcess function by the - /// program that started the application. - /// - ShowDefault = 10, - - /// - /// Windows 2000/XP: Minimizes a window, even if the thread - /// that owns the window is not responding. This flag should only be - /// used when minimizing windows from a different thread. - /// - ForceMinimize = 11 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/SoundFlags.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/SoundFlags.cs deleted file mode 100644 index 0ea597d08..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/SoundFlags.cs +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// See: https://msdn.microsoft.com/en-us/library/aa909766.aspx - /// - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum SoundFlags - { - SND_ASYNC = 0x0001, // play asynchronously - SND_MEMORY = 0x0004, // pszSound points to a memory file - SND_NOSTOP = 0x0010, // don't stop any currently playing sound - SND_NOWAIT = 0x00002000, // don't wait if the driver is busy - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/Win32Error.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/Win32Error.cs deleted file mode 100644 index 87259b3a9..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/Win32Error.cs +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// A Win32 error code. - /// - public enum Win32Error : uint - { - Success = 0x0, - InvalidFunction = 0x1, - FileNotFound = 0x2, - PathNotFound = 0x3, - TooManyOpenFiles = 0x4, - AccessDenied = 0x5, - InvalidHandle = 0x6, - ArenaTrashed = 0x7, - NotEnoughMemory = 0x8, - InvalidBlock = 0x9, - BadEnvironment = 0xa, - BadFormat = 0xb, - InvalidAccess = 0xc, - InvalidData = 0xd, - OutOfMemory = 0xe, - InvalidDrive = 0xf, - CurrentDirectory = 0x10, - NotSameDevice = 0x11, - NoMoreFiles = 0x12, - WriteProtect = 0x13, - BadUnit = 0x14, - NotReady = 0x15, - BadCommand = 0x16, - Crc = 0x17, - BadLength = 0x18, - Seek = 0x19, - NotDosDisk = 0x1a, - SectorNotFound = 0x1b, - OutOfPaper = 0x1c, - WriteFault = 0x1d, - ReadFault = 0x1e, - GenFailure = 0x1f, - SharingViolation = 0x20, - LockViolation = 0x21, - WrongDisk = 0x22, - SharingBufferExceeded = 0x24, - HandleEof = 0x26, - HandleDiskFull = 0x27, - NotSupported = 0x32, - RemNotList = 0x33, - DupName = 0x34, - BadNetPath = 0x35, - NetworkBusy = 0x36, - DevNotExist = 0x37, - TooManyCmds = 0x38, - FileExists = 0x50, - CannotMake = 0x52, - AlreadyAssigned = 0x55, - InvalidPassword = 0x56, - InvalidParameter = 0x57, - NetWriteFault = 0x58, - NoProcSlots = 0x59, - TooManySemaphores = 0x64, - ExclSemAlreadyOwned = 0x65, - SemIsSet = 0x66, - TooManySemRequests = 0x67, - InvalidAtInterruptTime = 0x68, - SemOwnerDied = 0x69, - SemUserLimit = 0x6a - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEvent.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEvent.cs deleted file mode 100644 index 73b47c2aa..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEvent.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// Used for User32.SetWinEventHook - /// See MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/dd318066%28v=vs.85%29.aspx - /// - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WinEvent : uint - { - EVENT_OBJECT_CREATE = 32768, - EVENT_OBJECT_DESTROY = 32769, - EVENT_OBJECT_NAMECHANGE = 32780, - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEventHookFlags.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEventHookFlags.cs deleted file mode 100644 index 809cb5248..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WinEventHookFlags.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// Used for User32.SetWinEventHook - /// See: https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640%28v=vs.85%29.aspx - /// - [SuppressMessage("ReSharper", "InconsistentNaming"), Flags] - public enum WinEventHookFlags - { - WINEVENT_SKIPOWNTHREAD = 1, - WINEVENT_SKIPOWNPROCESS = 2, - WINEVENT_OUTOFCONTEXT = 0, - WINEVENT_INCONTEXT = 4 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowLongIndex.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowLongIndex.cs deleted file mode 100644 index 6af978b3e..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowLongIndex.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WindowLongIndex - { - GWL_EXSTYLE = -20, // Sets a new extended window style. - GWL_STYLE = -16, // Sets a new window style. - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPlacementFlags.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPlacementFlags.cs deleted file mode 100644 index e59c9c6c1..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPlacementFlags.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WindowPlacementFlags : uint - { - // The coordinates of the minimized window may be specified. - // This flag must be specified if the coordinates are set in the ptMinPosition member. - WPF_SETMINPOSITION = 0x0001, - - // If the calling thread and the thread that owns the window are attached to different input queues, the system posts the request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads process the request. - WPF_ASYNCWINDOWPLACEMENT = 0x0004, - - // The restored window will be maximized, regardless of whether it was maximized before it was minimized. This setting is only valid the next time the window is restored. It does not change the default restoration behavior. - // This flag is only valid when the SW_SHOWMINIMIZED value is specified for the showCmd member. - WPF_RESTORETOMAXIMIZED = 0x0002 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPos.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPos.cs deleted file mode 100644 index 5d7a3caa2..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowPos.cs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WindowPos - { - SWP_NOACTIVATE = - 0x0010, // Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or non-topmost group (depending on the setting of the hWndInsertAfter parameter). - SWP_NOMOVE = 0x0002, //Retains the current position (ignores X and Y parameters). - SWP_NOSIZE = 0x0001, // Retains the current size (ignores the cx and cy parameters). - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowStyleFlags.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowStyleFlags.cs deleted file mode 100644 index 603e58196..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowStyleFlags.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// Window Style Flags - /// - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WindowStyleFlags : int - { - //WS_OVERLAPPED = 0x00000000, - WS_POPUP = -2147483648, - WS_CHILD = 0x40000000, - WS_MINIMIZE = 0x20000000, - WS_VISIBLE = 0x10000000, - WS_DISABLED = 0x08000000, - WS_CLIPSIBLINGS = 0x04000000, - WS_CLIPCHILDREN = 0x02000000, - WS_MAXIMIZE = 0x01000000, - WS_BORDER = 0x00800000, - WS_DLGFRAME = 0x00400000, - WS_VSCROLL = 0x00200000, - WS_HSCROLL = 0x00100000, - WS_SYSMENU = 0x00080000, - WS_THICKFRAME = 0x00040000, - WS_GROUP = 0x00020000, - WS_TABSTOP = 0x00010000 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowsMessages.cs b/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowsMessages.cs deleted file mode 100644 index 2aff5fe19..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/WindowsMessages.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums -{ - /// - /// All possible windows messages - /// See also here - /// - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum WindowsMessages : uint - { - WM_MOUSEACTIVATE = 0x0021, - WM_INPUTLANGCHANGEREQUEST = 0x0050, - WM_INPUTLANGCHANGE = 0x0051, - - - /// - /// Sent to a window to retrieve a handle to the large or small icon associated with a window. The system displays the large icon in the ALT+TAB dialog, and the small icon in the window caption. - /// A window receives this message through its WindowProc function. - /// WM_GETICON message - /// - WM_GETICON = 0x007F, - WM_CHAR = 0x0102, - WM_SYSCOMMAND = 0x0112 - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/GDI32.cs b/src/Greenshot.Base/UnmanagedHelpers/GDI32.cs deleted file mode 100644 index 224ab954a..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/GDI32.cs +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Security; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Microsoft.Win32.SafeHandles; - -namespace Greenshot.Base.UnmanagedHelpers -{ - public static class GDIExtensions - { - /// - /// Check if all the corners of the rectangle are visible in the specified region. - /// Not a perfect check, but this currently a workaround for checking if a window is completely visible - /// - /// - /// - /// - public static bool AreRectangleCornersVisisble(this Region region, Rectangle rectangle) - { - Point topLeft = new Point(rectangle.X, rectangle.Y); - Point topRight = new Point(rectangle.X + rectangle.Width, rectangle.Y); - Point bottomLeft = new Point(rectangle.X, rectangle.Y + rectangle.Height); - Point bottomRight = new Point(rectangle.X + rectangle.Width, rectangle.Y + rectangle.Height); - bool topLeftVisible = region.IsVisible(topLeft); - bool topRightVisible = region.IsVisible(topRight); - bool bottomLeftVisible = region.IsVisible(bottomLeft); - bool bottomRightVisible = region.IsVisible(bottomRight); - - return topLeftVisible && topRightVisible && bottomLeftVisible && bottomRightVisible; - } - - /// - /// Get a SafeHandle for the GetHdc, so one can use using to automatically cleanup the devicecontext - /// - /// - /// SafeDeviceContextHandle - public static SafeDeviceContextHandle GetSafeDeviceContext(this Graphics graphics) - { - return SafeDeviceContextHandle.FromGraphics(graphics); - } - } - - /// - /// Abstract class SafeObjectHandle which contains all handles that are cleaned with DeleteObject - /// - public abstract class SafeObjectHandle : SafeHandleZeroOrMinusOneIsInvalid - { - [DllImport("gdi32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool DeleteObject(IntPtr hObject); - - protected SafeObjectHandle(bool ownsHandle) : base(ownsHandle) - { - } - - protected override bool ReleaseHandle() - { - return DeleteObject(handle); - } - } - - /// - /// A hbitmap SafeHandle implementation - /// - public class SafeHBitmapHandle : SafeObjectHandle - { - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeHBitmapHandle() : base(true) - { - } - - [SecurityCritical] - public SafeHBitmapHandle(IntPtr preexistingHandle) : base(true) - { - SetHandle(preexistingHandle); - } - } - - /// - /// A hRegion SafeHandle implementation - /// - public class SafeRegionHandle : SafeObjectHandle - { - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeRegionHandle() : base(true) - { - } - - [SecurityCritical] - public SafeRegionHandle(IntPtr preexistingHandle) : base(true) - { - SetHandle(preexistingHandle); - } - } - - /// - /// A dibsection SafeHandle implementation - /// - public class SafeDibSectionHandle : SafeObjectHandle - { - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeDibSectionHandle() : base(true) - { - } - - [SecurityCritical] - public SafeDibSectionHandle(IntPtr preexistingHandle) : base(true) - { - SetHandle(preexistingHandle); - } - } - - /// - /// A select object safehandle implementation - /// This impl will select the passed SafeHandle to the HDC and replace the returned value when disposing - /// - public class SafeSelectObjectHandle : SafeHandleZeroOrMinusOneIsInvalid - { - [DllImport("gdi32", SetLastError = true)] - private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); - - private readonly SafeHandle _hdc; - - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeSelectObjectHandle() : base(true) - { - } - - [SecurityCritical] - public SafeSelectObjectHandle(SafeDCHandle hdc, SafeHandle newHandle) : base(true) - { - _hdc = hdc; - SetHandle(SelectObject(hdc.DangerousGetHandle(), newHandle.DangerousGetHandle())); - } - - protected override bool ReleaseHandle() - { - SelectObject(_hdc.DangerousGetHandle(), handle); - return true; - } - } - - public abstract class SafeDCHandle : SafeHandleZeroOrMinusOneIsInvalid - { - protected SafeDCHandle(bool ownsHandle) : base(ownsHandle) - { - } - } - - /// - /// A CompatibleDC SafeHandle implementation - /// - public class SafeCompatibleDCHandle : SafeDCHandle - { - [DllImport("gdi32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool DeleteDC(IntPtr hDC); - - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeCompatibleDCHandle() : base(true) - { - } - - [SecurityCritical] - public SafeCompatibleDCHandle(IntPtr preexistingHandle) : base(true) - { - SetHandle(preexistingHandle); - } - - public SafeSelectObjectHandle SelectObject(SafeHandle newHandle) - { - return new SafeSelectObjectHandle(this, newHandle); - } - - protected override bool ReleaseHandle() - { - return DeleteDC(handle); - } - } - - /// - /// A DeviceContext SafeHandle implementation - /// - public class SafeDeviceContextHandle : SafeDCHandle - { - private readonly Graphics _graphics; - - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeDeviceContextHandle() : base(true) - { - } - - [SecurityCritical] - public SafeDeviceContextHandle(Graphics graphics, IntPtr preexistingHandle) : base(true) - { - _graphics = graphics; - SetHandle(preexistingHandle); - } - - protected override bool ReleaseHandle() - { - _graphics.ReleaseHdc(handle); - return true; - } - - public static SafeDeviceContextHandle FromGraphics(Graphics graphics) - { - return new SafeDeviceContextHandle(graphics, graphics.GetHdc()); - } - } - - /// - /// GDI32 Helpers - /// - public static class GDI32 - { - [DllImport("gdi32", SetLastError = true)] - public static extern bool BitBlt(SafeHandle hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, SafeHandle hdcSrc, int nXSrc, int nYSrc, CopyPixelOperation dwRop); - - [DllImport("gdi32", SetLastError = true)] - public static extern SafeCompatibleDCHandle CreateCompatibleDC(SafeHandle hDC); - - [DllImport("gdi32", SetLastError = true)] - public static extern SafeDibSectionHandle CreateDIBSection(SafeHandle hdc, ref BITMAPINFOHEADER bmi, uint Usage, out IntPtr bits, IntPtr hSection, uint dwOffset); - - [DllImport("gdi32", SetLastError = true)] - public static extern SafeRegionHandle CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); - - [DllImport("gdi32", SetLastError = true)] - public static extern uint GetPixel(SafeHandle hdc, int nXPos, int nYPos); - - [DllImport("gdi32", SetLastError = true)] - public static extern int GetDeviceCaps(SafeHandle hdc, DeviceCaps nIndex); - } - - [StructLayout(LayoutKind.Sequential, Pack = 2)] - public struct BITMAPFILEHEADER - { - public static readonly short BM = 0x4d42; // BM - public short bfType; - public int bfSize; - public short bfReserved1; - public short bfReserved2; - public int bfOffBits; - } - - [StructLayout(LayoutKind.Sequential)] - public struct BitfieldColorMask - { - public uint blue; - public uint green; - public uint red; - - public void InitValues() - { - red = (uint) 255 << 8; - green = (uint) 255 << 16; - blue = (uint) 255 << 24; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct CIEXYZ - { - public uint ciexyzX; //FXPT2DOT30 - public uint ciexyzY; //FXPT2DOT30 - public uint ciexyzZ; //FXPT2DOT30 - - public CIEXYZ(uint FXPT2DOT30) - { - ciexyzX = FXPT2DOT30; - ciexyzY = FXPT2DOT30; - ciexyzZ = FXPT2DOT30; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct CIEXYZTRIPLE - { - public CIEXYZ ciexyzRed; - public CIEXYZ ciexyzGreen; - public CIEXYZ ciexyzBlue; - } - - public enum BI_COMPRESSION : uint - { - BI_RGB = 0, // Uncompressed - BI_RLE8 = 1, // RLE 8BPP - BI_RLE4 = 2, // RLE 4BPP - - BI_BITFIELDS = - 3, // Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks that specify the red, green, and blue components, respectively, of each pixel. This is valid when used with 16- and 32-bpp bitmaps. - BI_JPEG = 4, // Indicates that the image is a JPEG image. - BI_PNG = 5 // Indicates that the image is a PNG image. - } - - [StructLayout(LayoutKind.Explicit)] - public struct BITMAPINFOHEADER - { - [FieldOffset(0)] public uint biSize; - [FieldOffset(4)] public int biWidth; - [FieldOffset(8)] public int biHeight; - [FieldOffset(12)] public ushort biPlanes; - [FieldOffset(14)] public ushort biBitCount; - [FieldOffset(16)] public BI_COMPRESSION biCompression; - [FieldOffset(20)] public uint biSizeImage; - [FieldOffset(24)] public int biXPelsPerMeter; - [FieldOffset(28)] public int biYPelsPerMeter; - [FieldOffset(32)] public uint biClrUsed; - [FieldOffset(36)] public uint biClrImportant; - [FieldOffset(40)] public uint bV5RedMask; - [FieldOffset(44)] public uint bV5GreenMask; - [FieldOffset(48)] public uint bV5BlueMask; - [FieldOffset(52)] public uint bV5AlphaMask; - [FieldOffset(56)] public uint bV5CSType; - [FieldOffset(60)] public CIEXYZTRIPLE bV5Endpoints; - [FieldOffset(96)] public uint bV5GammaRed; - [FieldOffset(100)] public uint bV5GammaGreen; - [FieldOffset(104)] public uint bV5GammaBlue; - [FieldOffset(108)] public uint bV5Intent; // Rendering intent for bitmap - [FieldOffset(112)] public uint bV5ProfileData; - [FieldOffset(116)] public uint bV5ProfileSize; - [FieldOffset(120)] public uint bV5Reserved; - - public const int DIB_RGB_COLORS = 0; - - public BITMAPINFOHEADER(int width, int height, ushort bpp) - { - biSize = (uint) Marshal.SizeOf(typeof(BITMAPINFOHEADER)); // BITMAPINFOHEADER < DIBV5 is 40 bytes - biPlanes = 1; // Should allways be 1 - biCompression = BI_COMPRESSION.BI_RGB; - biWidth = width; - biHeight = height; - biBitCount = bpp; - biSizeImage = (uint) (width * height * (bpp >> 3)); - biXPelsPerMeter = 0; - biYPelsPerMeter = 0; - biClrUsed = 0; - biClrImportant = 0; - - // V5 - bV5RedMask = (uint) 255 << 16; - bV5GreenMask = (uint) 255 << 8; - bV5BlueMask = 255; - bV5AlphaMask = (uint) 255 << 24; - bV5CSType = 0x73524742; // LCS_sRGB - bV5Endpoints = new CIEXYZTRIPLE - { - ciexyzBlue = new CIEXYZ(0), - ciexyzGreen = new CIEXYZ(0), - ciexyzRed = new CIEXYZ(0) - }; - bV5GammaRed = 0; - bV5GammaGreen = 0; - bV5GammaBlue = 0; - bV5Intent = 4; - bV5ProfileData = 0; - bV5ProfileSize = 0; - bV5Reserved = 0; - } - - public bool IsDibV5 - { - get - { - uint sizeOfBMI = (uint) Marshal.SizeOf(typeof(BITMAPINFOHEADER)); - return biSize >= sizeOfBMI; - } - } - - public uint OffsetToPixels - { - get - { - if (biCompression == BI_COMPRESSION.BI_BITFIELDS) - { - // Add 3x4 bytes for the bitfield color mask - return biSize + 3 * 4; - } - - return biSize; - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/GDIplus.cs b/src/Greenshot.Base/UnmanagedHelpers/GDIplus.cs deleted file mode 100644 index 6bf30fdcc..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/GDIplus.cs +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Reflection; -using System.Runtime.InteropServices; -using Greenshot.Base.UnmanagedHelpers.Structs; -using log4net; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Contains members that specify the nature of a Gaussian blur. - /// - /// Cannot be pinned with GCHandle due to bool value. - [StructLayout(LayoutKind.Sequential, Pack = 1)] - internal struct BlurParams - { - /// - /// Real number that specifies the blur radius (the radius of the Gaussian convolution kernel) in - /// pixels. The radius must be in the range 0 through 255. As the radius increases, the resulting - /// bitmap becomes more blurry. - /// - public float Radius; - - /// - /// Boolean value that specifies whether the bitmap expands by an amount equal to the blur radius. - /// If TRUE, the bitmap expands by an amount equal to the radius so that it can have soft edges. - /// If FALSE, the bitmap remains the same size and the soft edges are clipped. - /// - public bool ExpandEdges; - } - - /// - /// GDI Plus unit description. - /// - public enum GpUnit - { - /// - /// World coordinate (non-physical unit). - /// - UnitWorld, - - /// - /// Variable - for PageTransform only. - /// - UnitDisplay, - - /// - /// Each unit is one device pixel. - /// - UnitPixel, - - /// - /// Each unit is a printer's point, or 1/72 inch. - /// - UnitPoint, - - /// - /// Each unit is 1 inch. - /// - UnitInch, - - /// - /// Each unit is 1/300 inch. - /// - UnitDocument, - - /// - /// Each unit is 1 millimeter. - /// - UnitMillimeter - } - - /// - /// GDIplus Helpers - /// - public static class GDIplus - { - private static readonly ILog Log = LogManager.GetLogger(typeof(GDIplus)); - - [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] - private static extern int GdipBitmapApplyEffect(IntPtr bitmap, IntPtr effect, ref RECT rectOfInterest, bool useAuxData, IntPtr auxData, int auxDataSize); - - [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] - private static extern int GdipDrawImageFX(IntPtr graphics, IntPtr bitmap, ref RECTF source, IntPtr matrix, IntPtr effect, IntPtr imageAttributes, GpUnit srcUnit); - - [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] - private static extern int GdipSetEffectParameters(IntPtr effect, IntPtr parameters, uint size); - - [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] - private static extern int GdipCreateEffect(Guid guid, out IntPtr effect); - - [DllImport("gdiplus.dll", SetLastError = true, ExactSpelling = true)] - private static extern int GdipDeleteEffect(IntPtr effect); - - private static readonly Guid BlurEffectGuid = new Guid("{633C80A4-1843-482B-9EF2-BE2834C5FDD4}"); - - // Constant "FieldInfo" for getting the nativeImage from the Bitmap - private static readonly FieldInfo FIELD_INFO_NATIVE_IMAGE = typeof(Bitmap).GetField("nativeImage", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); - - // Constant "FieldInfo" for getting the NativeGraphics from the Graphics - private static readonly FieldInfo FIELD_INFO_NATIVE_GRAPHICS = - typeof(Graphics).GetField("nativeGraphics", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); - - // Constant "FieldInfo" for getting the nativeMatrix from the Matrix - private static readonly FieldInfo FIELD_INFO_NATIVE_MATRIX = - typeof(Matrix).GetField("nativeMatrix", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); - - // Constant "FieldInfo" for getting the nativeImageAttributes from the ImageAttributes - private static readonly FieldInfo FIELD_INFO_NATIVE_IMAGEATTRIBUTES = - typeof(ImageAttributes).GetField("nativeImageAttributes", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); - - private static bool _isBlurEnabled = Environment.OSVersion.Version.Major >= 6; - - /// - /// Get the nativeImage field from the bitmap - /// - /// - /// IntPtr - private static IntPtr GetNativeImage(Bitmap bitmap) - { - if (bitmap == null) - { - return IntPtr.Zero; - } - - return (IntPtr) FIELD_INFO_NATIVE_IMAGE.GetValue(bitmap); - } - - /// - /// Get the NativeGraphics field from the graphics - /// - /// - /// IntPtr - private static IntPtr GetNativeGraphics(Graphics graphics) - { - if (graphics == null) - { - return IntPtr.Zero; - } - - return (IntPtr) FIELD_INFO_NATIVE_GRAPHICS.GetValue(graphics); - } - - /// - /// Get the nativeMatrix field from the matrix - /// - /// - /// IntPtr - private static IntPtr GetNativeMatrix(Matrix matrix) - { - if (matrix == null) - { - return IntPtr.Zero; - } - - return (IntPtr) FIELD_INFO_NATIVE_MATRIX.GetValue(matrix); - } - - /// - /// Get the nativeImageAttributes field from the ImageAttributes - /// - /// - /// IntPtr - private static IntPtr GetNativeImageAttributes(ImageAttributes imageAttributes) - { - if (imageAttributes == null) - { - return IntPtr.Zero; - } - - return (IntPtr) FIELD_INFO_NATIVE_IMAGEATTRIBUTES.GetValue(imageAttributes); - } - - /// - /// Returns if a GDIPlus blur can be made for the supplied radius. - /// This accounts for the "bug" I reported here: https://social.technet.microsoft.com/Forums/en/w8itprogeneral/thread/99ddbe9d-556d-475a-8bab-84e25aa13a2c - /// - /// - /// false if blur is not possible - public static bool IsBlurPossible(int radius) - { - if (!_isBlurEnabled) - { - return false; - } - - if (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor < 2) - { - return true; - } - - return Environment.OSVersion.Version.Major > 6 && radius >= 20; - } - - /// - /// Use the GDI+ blur effect on the bitmap - /// - /// Bitmap to apply the effect to - /// Rectangle to apply the blur effect to - /// 0-255 - /// bool true if the edges are expanded with the radius - /// false if there is no GDI+ available or an exception occurred - public static bool ApplyBlur(Bitmap destinationBitmap, Rectangle area, int radius, bool expandEdges) - { - if (!IsBlurPossible(radius)) - { - return false; - } - - IntPtr hBlurParams = IntPtr.Zero; - IntPtr hEffect = IntPtr.Zero; - - try - { - // Create the GDI+ BlurEffect, using the Guid - int status = GdipCreateEffect(BlurEffectGuid, out hEffect); - if (status != 0) - { - return false; - } - - // Create a BlurParams struct and set the values - var blurParams = new BlurParams - { - Radius = radius, - ExpandEdges = expandEdges - }; - - // Allocate space in unmanaged memory - hBlurParams = Marshal.AllocHGlobal(Marshal.SizeOf(blurParams)); - // Copy the structure to the unmanaged memory - Marshal.StructureToPtr(blurParams, hBlurParams, false); - - - // Set the blurParams to the effect - GdipSetEffectParameters(hEffect, hBlurParams, (uint) Marshal.SizeOf(blurParams)); - - // Somewhere it said we can use destinationBitmap.GetHbitmap(), this doesn't work!! - // Get the private nativeImage property from the Bitmap - IntPtr hBitmap = GetNativeImage(destinationBitmap); - - // Create a RECT from the Rectangle - RECT rec = new RECT(area); - // Apply the effect to the bitmap in the specified area - GdipBitmapApplyEffect(hBitmap, hEffect, ref rec, false, IntPtr.Zero, 0); - - // Everything worked, return true - return true; - } - catch (Exception ex) - { - _isBlurEnabled = false; - Log.Error("Problem using GdipBitmapApplyEffect: ", ex); - return false; - } - finally - { - try - { - if (hEffect != IntPtr.Zero) - { - // Delete the effect - GdipDeleteEffect(hEffect); - } - - if (hBlurParams != IntPtr.Zero) - { - // Free the memory - Marshal.FreeHGlobal(hBlurParams); - } - } - catch (Exception ex) - { - _isBlurEnabled = false; - Log.Error("Problem cleaning up ApplyBlur: ", ex); - } - } - } - - /// - /// Draw the image on the graphics with GDI+ blur effect - /// - /// false if there is no GDI+ available or an exception occurred - public static bool DrawWithBlur(Graphics graphics, Bitmap image, Rectangle source, Matrix transform, ImageAttributes imageAttributes, int radius, bool expandEdges) - { - if (!IsBlurPossible(radius)) - { - return false; - } - - IntPtr hBlurParams = IntPtr.Zero; - IntPtr hEffect = IntPtr.Zero; - - try - { - // Create the GDI+ BlurEffect, using the Guid - int status = GdipCreateEffect(BlurEffectGuid, out hEffect); - if (status != 0) - { - return false; - } - - // Create a BlurParams struct and set the values - var blurParams = new BlurParams - { - Radius = radius, - ExpandEdges = false - }; - //blurParams.Padding = radius; - - // Allocate space in unmanaged memory - hBlurParams = Marshal.AllocHGlobal(Marshal.SizeOf(blurParams)); - // Copy the structure to the unmanaged memory - Marshal.StructureToPtr(blurParams, hBlurParams, true); - - // Set the blurParams to the effect - GdipSetEffectParameters(hEffect, hBlurParams, (uint) Marshal.SizeOf(blurParams)); - - // Somewhere it said we can use destinationBitmap.GetHbitmap(), this doesn't work!! - // Get the private nativeImage property from the Bitmap - IntPtr hBitmap = GetNativeImage(image); - IntPtr hGraphics = GetNativeGraphics(graphics); - IntPtr hMatrix = GetNativeMatrix(transform); - IntPtr hAttributes = GetNativeImageAttributes(imageAttributes); - - // Create a RECT from the Rectangle - RECTF sourceRecf = new RECTF(source); - // Apply the effect to the bitmap in the specified area - GdipDrawImageFX(hGraphics, hBitmap, ref sourceRecf, hMatrix, hEffect, hAttributes, GpUnit.UnitPixel); - - // Everything worked, return true - return true; - } - catch (Exception ex) - { - _isBlurEnabled = false; - Log.Error("Problem using GdipDrawImageFX: ", ex); - return false; - } - finally - { - try - { - if (hEffect != IntPtr.Zero) - { - // Delete the effect - GdipDeleteEffect(hEffect); - } - - if (hBlurParams != IntPtr.Zero) - { - // Free the memory - Marshal.FreeHGlobal(hBlurParams); - } - } - catch (Exception ex) - { - _isBlurEnabled = false; - Log.Error("Problem cleaning up DrawWithBlur: ", ex); - } - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Kernel32.cs b/src/Greenshot.Base/UnmanagedHelpers/Kernel32.cs deleted file mode 100644 index 310864c75..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Kernel32.cs +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Runtime.InteropServices; -using System.Text; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Description of Kernel32. - /// - public class Kernel32 - { - public const uint ATTACHCONSOLE_ATTACHPARENTPROCESS = 0x0ffffffff; // default value if not specifing a process ID - - [DllImport("kernel32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool AttachConsole(uint dwProcessId); - - [DllImport("kernel32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool AllocConsole(); - - [DllImport("kernel32", SetLastError = true)] - public static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId); - - [DllImport("kernel32", SetLastError = true)] - public static extern uint SuspendThread(IntPtr hThread); - - [DllImport("kernel32", SetLastError = true)] - public static extern int ResumeThread(IntPtr hThread); - - [DllImport("kernel32", SetLastError = true)] - public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId); - - [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, StringBuilder lpExeName, ref uint lpdwSize); - - [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, uint uuchMax); - - [DllImport("kernel32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool CloseHandle(IntPtr hObject); - - [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Auto)] - public static extern int GetPackageFullName(IntPtr hProcess, ref Int32 packageFullNameLength, StringBuilder fullName); - - - /// - /// Method to get the process path - /// - /// - /// - public static string GetProcessPath(int processid) - { - StringBuilder _PathBuffer = new StringBuilder(512); - // Try the GetModuleFileName method first since it's the fastest. - // May return ACCESS_DENIED (due to VM_READ flag) if the process is not owned by the current user. - // Will fail if we are compiled as x86 and we're trying to open a 64 bit process...not allowed. - IntPtr hprocess = OpenProcess(ProcessAccessFlags.QueryInformation | ProcessAccessFlags.VMRead, false, processid); - if (hprocess != IntPtr.Zero) - { - try - { - if (PsAPI.GetModuleFileNameEx(hprocess, IntPtr.Zero, _PathBuffer, (uint) _PathBuffer.Capacity) > 0) - { - return _PathBuffer.ToString(); - } - } - finally - { - CloseHandle(hprocess); - } - } - - hprocess = OpenProcess(ProcessAccessFlags.QueryInformation, false, processid); - if (hprocess != IntPtr.Zero) - { - try - { - // Try this method for Vista or higher operating systems - uint size = (uint) _PathBuffer.Capacity; - if ((Environment.OSVersion.Version.Major >= 6) && (QueryFullProcessImageName(hprocess, 0, _PathBuffer, ref size) && (size > 0))) - { - return _PathBuffer.ToString(); - } - - // Try the GetProcessImageFileName method - if (PsAPI.GetProcessImageFileName(hprocess, _PathBuffer, (uint) _PathBuffer.Capacity) > 0) - { - string dospath = _PathBuffer.ToString(); - foreach (string drive in Environment.GetLogicalDrives()) - { - if (QueryDosDevice(drive.TrimEnd('\\'), _PathBuffer, (uint) _PathBuffer.Capacity) > 0) - { - if (dospath.StartsWith(_PathBuffer.ToString())) - { - return drive + dospath.Remove(0, _PathBuffer.Length); - } - } - } - } - } - finally - { - CloseHandle(hprocess); - } - } - - return string.Empty; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/PsAPI.cs b/src/Greenshot.Base/UnmanagedHelpers/PsAPI.cs deleted file mode 100644 index 9ae782b86..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/PsAPI.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Text; -using log4net; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Description of PsAPI. - /// - public class PsAPI - { - private static readonly ILog LOG = LogManager.GetLogger(typeof(PsAPI)); - - [DllImport("psapi", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, StringBuilder lpFilename, uint nSize); - - [DllImport("psapi", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern uint GetProcessImageFileName(IntPtr hProcess, StringBuilder lpImageFileName, uint nSize); - - [DllImport("psapi")] - private static extern int EmptyWorkingSet(IntPtr hwProc); - - /// - /// Make the process use less memory by emptying the working set - /// - public static void EmptyWorkingSet() - { - LOG.Info("Calling EmptyWorkingSet"); - using Process currentProcess = Process.GetCurrentProcess(); - EmptyWorkingSet(currentProcess.Handle); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/SafeCurrentInputDesktopHandle.cs b/src/Greenshot.Base/UnmanagedHelpers/SafeCurrentInputDesktopHandle.cs deleted file mode 100644 index 113117eae..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/SafeCurrentInputDesktopHandle.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Security.Permissions; -using Greenshot.Base.UnmanagedHelpers.Enums; -using log4net; -using Microsoft.Win32.SafeHandles; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// A SafeHandle class implementation for the current input desktop - /// - public class SafeCurrentInputDesktopHandle : SafeHandleZeroOrMinusOneIsInvalid - { - private static readonly ILog LOG = LogManager.GetLogger(typeof(SafeCurrentInputDesktopHandle)); - - public SafeCurrentInputDesktopHandle() : base(true) - { - IntPtr hDesktop = User32.OpenInputDesktop(0, true, DesktopAccessRight.GENERIC_ALL); - if (hDesktop != IntPtr.Zero) - { - SetHandle(hDesktop); - if (User32.SetThreadDesktop(hDesktop)) - { - LOG.DebugFormat("Switched to desktop {0}", hDesktop); - } - else - { - LOG.WarnFormat("Couldn't switch to desktop {0}", hDesktop); - LOG.Error(User32.CreateWin32Exception("SetThreadDesktop")); - } - } - else - { - LOG.Warn("Couldn't get current desktop."); - LOG.Error(User32.CreateWin32Exception("OpenInputDesktop")); - } - } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] - protected override bool ReleaseHandle() - { - return User32.CloseDesktop(handle); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/SafeIconHandle.cs b/src/Greenshot.Base/UnmanagedHelpers/SafeIconHandle.cs deleted file mode 100644 index acb280287..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/SafeIconHandle.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Security; -using System.Security.Permissions; -using Microsoft.Win32.SafeHandles; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// A SafeHandle class implementation for the hIcon - /// - public class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid - { - /// - /// Needed for marshalling return values - /// - [SecurityCritical] - public SafeIconHandle() : base(true) - { - } - - - public SafeIconHandle(IntPtr hIcon) : base(true) - { - SetHandle(hIcon); - } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] - protected override bool ReleaseHandle() - { - return User32.DestroyIcon(handle); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/SafeWindowDcHandle.cs b/src/Greenshot.Base/UnmanagedHelpers/SafeWindowDcHandle.cs deleted file mode 100644 index 7ccdbf684..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/SafeWindowDcHandle.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Security; -using System.Security.Permissions; -using Microsoft.Win32.SafeHandles; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// A WindowDC SafeHandle implementation - /// - public class SafeWindowDcHandle : SafeHandleZeroOrMinusOneIsInvalid - { - [DllImport("user32", SetLastError = true)] - private static extern IntPtr GetWindowDC(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - private static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); - - private readonly IntPtr _hWnd; - - /// - /// Needed for marshalling return values - /// - public SafeWindowDcHandle() : base(true) - { - } - - [SecurityCritical] - public SafeWindowDcHandle(IntPtr hWnd, IntPtr preexistingHandle) : base(true) - { - _hWnd = hWnd; - SetHandle(preexistingHandle); - } - - [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] - protected override bool ReleaseHandle() - { - bool returnValue = ReleaseDC(_hWnd, handle); - return returnValue; - } - - /// - /// Creates a DC as SafeWindowDcHandle for the whole of the specified hWnd - /// - /// IntPtr - /// SafeWindowDcHandle - public static SafeWindowDcHandle FromWindow(IntPtr hWnd) - { - if (hWnd == IntPtr.Zero) - { - return null; - } - - var hDcDesktop = GetWindowDC(hWnd); - return new SafeWindowDcHandle(hWnd, hDcDesktop); - } - - public static SafeWindowDcHandle FromDesktop() - { - IntPtr hWndDesktop = User32.GetDesktopWindow(); - IntPtr hDCDesktop = GetWindowDC(hWndDesktop); - return new SafeWindowDcHandle(hWndDesktop, hDCDesktop); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Shell32.cs b/src/Greenshot.Base/UnmanagedHelpers/Shell32.cs deleted file mode 100644 index 528cf89eb..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Shell32.cs +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.IO; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Description of Shell32. - /// - public static class Shell32 - { - [DllImport("shell32", CharSet = CharSet.Unicode)] - public static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons); - - [DllImport("shell32", CharSet = CharSet.Unicode)] - private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - private struct SHFILEINFO - { - public readonly IntPtr hIcon; - public readonly int iIcon; - public readonly uint dwAttributes; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public readonly string szDisplayName; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] - public readonly string szTypeName; - }; - - // Browsing for directory. - - private const uint SHGFI_ICON = 0x000000100; // get icon - private const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon - private const uint SHGFI_LARGEICON = 0x000000000; // get large icon - private const uint SHGFI_SMALLICON = 0x000000001; // get small icon - private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute - private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; - - /// - /// Options to specify the size of icons to return. - /// - public enum IconSize - { - /// - /// Specify large icon - 32 pixels by 32 pixels. - /// - Large = 0, - - /// - /// Specify small icon - 16 pixels by 16 pixels. - /// - Small = 1 - } - - /// - /// Returns an icon for a given file extension - indicated by the name parameter. - /// See: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v=vs.85).aspx - /// - /// Filename - /// Large or small - /// Whether to include the link icon - /// System.Drawing.Icon - public static Icon GetFileIcon(string filename, IconSize size, bool linkOverlay) - { - SHFILEINFO shfi = new SHFILEINFO(); - // SHGFI_USEFILEATTRIBUTES makes it simulate, just gets the icon for the extension - uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; - - if (linkOverlay) - { - flags += SHGFI_LINKOVERLAY; - } - - // Check the size specified for return. - if (IconSize.Small == size) - { - flags += SHGFI_SMALLICON; - } - else - { - flags += SHGFI_LARGEICON; - } - - SHGetFileInfo(Path.GetFileName(filename), FILE_ATTRIBUTE_NORMAL, ref shfi, (uint) Marshal.SizeOf(shfi), flags); - - // Only return an icon if we really got one - if (shfi.hIcon != IntPtr.Zero) - { - // Copy (clone) the returned icon to a new object, thus allowing us to clean-up properly - Icon icon = (Icon) Icon.FromHandle(shfi.hIcon).Clone(); - // Cleanup - User32.DestroyIcon(shfi.hIcon); - return icon; - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/POINT.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/POINT.cs deleted file mode 100644 index fe65a6b8d..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/POINT.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - [StructLayout(LayoutKind.Sequential), Serializable()] - public struct POINT - { - public int X; - public int Y; - - public POINT(int x, int y) - { - X = x; - Y = y; - } - - public POINT(Point point) - { - X = point.X; - Y = point.Y; - } - - public static implicit operator Point(POINT p) - { - return new Point(p.X, p.Y); - } - - public static implicit operator POINT(Point p) - { - return new POINT(p.X, p.Y); - } - - public Point ToPoint() - { - return new Point(X, Y); - } - - public override string ToString() - { - return X + "," + Y; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/RECT.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/RECT.cs deleted file mode 100644 index d28f11d2b..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/RECT.cs +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Drawing; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - [StructLayout(LayoutKind.Sequential), Serializable()] - public struct RECT - { - private int _Left; - private int _Top; - private int _Right; - private int _Bottom; - - public RECT(RECT rectangle) - : this(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom) - { - } - - public RECT(Rectangle rectangle) - : this(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom) - { - } - - public RECT(int left, int top, int right, int bottom) - { - _Left = left; - _Top = top; - _Right = right; - _Bottom = bottom; - } - - public int X - { - get { return _Left; } - set { _Left = value; } - } - - public int Y - { - get { return _Top; } - set { _Top = value; } - } - - public int Left - { - get { return _Left; } - set { _Left = value; } - } - - public int Top - { - get { return _Top; } - set { _Top = value; } - } - - public int Right - { - get { return _Right; } - set { _Right = value; } - } - - public int Bottom - { - get { return _Bottom; } - set { _Bottom = value; } - } - - public int Height - { - get { return _Bottom - _Top; } - set { _Bottom = value - _Top; } - } - - public int Width - { - get { return _Right - _Left; } - set { _Right = value + _Left; } - } - - public Point Location - { - get { return new Point(Left, Top); } - set - { - _Left = value.X; - _Top = value.Y; - } - } - - public Size Size - { - get { return new Size(Width, Height); } - set - { - _Right = value.Width + _Left; - _Bottom = value.Height + _Top; - } - } - - public static implicit operator Rectangle(RECT rectangle) - { - return new Rectangle(rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height); - } - - public static implicit operator RECT(Rectangle rectangle) - { - return new RECT(rectangle.Left, rectangle.Top, rectangle.Right, rectangle.Bottom); - } - - public static bool operator ==(RECT rectangle1, RECT rectangle2) - { - return rectangle1.Equals(rectangle2); - } - - public static bool operator !=(RECT rectangle1, RECT rectangle2) - { - return !rectangle1.Equals(rectangle2); - } - - public override string ToString() - { - return "{Left: " + _Left + "; " + "Top: " + _Top + "; Right: " + _Right + "; Bottom: " + _Bottom + "}"; - } - - public override int GetHashCode() - { - return ToString().GetHashCode(); - } - - public bool Equals(RECT rectangle) - { - return rectangle.Left == _Left && rectangle.Top == _Top && rectangle.Right == _Right && rectangle.Bottom == _Bottom; - } - - public Rectangle ToRectangle() - { - return new Rectangle(Left, Top, Width, Height); - } - - public override bool Equals(object Object) - { - if (Object is RECT) - { - return Equals((RECT) Object); - } - else if (Object is Rectangle) - { - return Equals(new RECT((Rectangle) Object)); - } - - return false; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/RECTF.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/RECTF.cs deleted file mode 100644 index 26be5eb63..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/RECTF.cs +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Drawing; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - /// - /// A floating point GDI Plus width/hight based rectangle. - /// - [StructLayout(LayoutKind.Sequential)] - public struct RECTF - { - /// - /// The X corner location of the rectangle. - /// - public float X; - - /// - /// The Y corner location of the rectangle. - /// - public float Y; - - /// - /// The width of the rectangle. - /// - public float Width; - - /// - /// The height of the rectangle. - /// - public float Height; - - /// - /// Creates a new GDI Plus rectangle. - /// - /// The X corner location of the rectangle. - /// The Y corner location of the rectangle. - /// The width of the rectangle. - /// The height of the rectangle. - public RECTF(float x, float y, float width, float height) - { - X = x; - Y = y; - Width = width; - Height = height; - } - - /// - /// Creates a new GDI Plus rectangle from a System.Drawing.RectangleF. - /// - /// The rectangle to base this GDI Plus rectangle on. - public RECTF(RectangleF rect) - { - X = rect.X; - Y = rect.Y; - Width = rect.Width; - Height = rect.Height; - } - - /// - /// Creates a new GDI Plus rectangle from a System.Drawing.Rectangle. - /// - /// The rectangle to base this GDI Plus rectangle on. - public RECTF(Rectangle rect) - { - X = rect.X; - Y = rect.Y; - Width = rect.Width; - Height = rect.Height; - } - - /// - /// Returns a RectangleF for this GDI Plus rectangle. - /// - /// A System.Drawing.RectangleF structure. - public RectangleF ToRectangle() - { - return new RectangleF(X, Y, Width, Height); - } - - /// - /// Returns a RectangleF for a GDI Plus rectangle. - /// - /// The GDI Plus rectangle to get the RectangleF for. - /// A System.Drawing.RectangleF structure. - public static RectangleF ToRectangle(RECTF rect) - { - return rect.ToRectangle(); - } - - /// - /// Returns a GDI Plus rectangle for a RectangleF structure. - /// - /// The RectangleF to get the GDI Plus rectangle for. - /// A GDI Plus rectangle structure. - public static RECTF FromRectangle(RectangleF rect) - { - return new RECTF(rect); - } - - /// - /// Returns a GDI Plus rectangle for a Rectangle structure. - /// - /// The Rectangle to get the GDI Plus rectangle for. - /// A GDI Plus rectangle structure. - public static RECTF FromRectangle(Rectangle rect) - { - return new RECTF(rect); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/SCROLLINFO.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/SCROLLINFO.cs deleted file mode 100644 index cf9eaa937..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/SCROLLINFO.cs +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - [Serializable, StructLayout(LayoutKind.Sequential)] - public struct SCROLLINFO - { - public int cbSize; - public int fMask; - public int nMin; - public int nMax; - public int nPage; - public int nPos; - public int nTrackPos; - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowInfo.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowInfo.cs deleted file mode 100644 index f0b85cf2e..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Runtime.InteropServices; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - /// - /// The structure for the WindowInfo - /// See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms632610%28v=vs.85%29.aspx - /// - [StructLayout(LayoutKind.Sequential), Serializable] - public struct WindowInfo - { - public uint cbSize; - public RECT rcWindow; - public RECT rcClient; - public uint dwStyle; - public uint dwExStyle; - public uint dwWindowStatus; - public uint cxWindowBorders; - public uint cyWindowBorders; - public ushort atomWindowType; - - public ushort wCreatorVersion; - - // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)". - public WindowInfo(bool? filler) : this() - { - cbSize = (uint) (Marshal.SizeOf(typeof(WindowInfo))); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowPlacement.cs b/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowPlacement.cs deleted file mode 100644 index a542a8cf0..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/WindowPlacement.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Runtime.InteropServices; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - /// - /// Contains information about the placement of a window on the screen. - /// - [StructLayout(LayoutKind.Sequential), Serializable()] - public struct WindowPlacement - { - /// - /// The length of the structure, in bytes. Before calling the GetWindowPlacement or SetWindowPlacement functions, set this member to sizeof(WINDOWPLACEMENT). - /// - /// GetWindowPlacement and SetWindowPlacement fail if this member is not set correctly. - /// - /// - public int Length; - - /// - /// Specifies flags that control the position of the minimized window and the method by which the window is restored. - /// - public WindowPlacementFlags Flags; - - /// - /// The current show state of the window. - /// - public ShowWindowCommand ShowCmd; - - /// - /// The coordinates of the window's upper-left corner when the window is minimized. - /// - public POINT MinPosition; - - /// - /// The coordinates of the window's upper-left corner when the window is maximized. - /// - public POINT MaxPosition; - - /// - /// The window's coordinates when the window is in the restored position. - /// - public RECT NormalPosition; - - /// - /// Gets the default (empty) value. - /// - public static WindowPlacement Default - { - get - { - WindowPlacement result = new WindowPlacement(); - result.Length = Marshal.SizeOf(result); - return result; - } - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/User32.cs b/src/Greenshot.Base/UnmanagedHelpers/User32.cs deleted file mode 100644 index 67a18ffeb..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/User32.cs +++ /dev/null @@ -1,333 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Text; -using System.Windows.Forms; -using Greenshot.Base.Core.Enums; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; -using log4net; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// User32 Wrappers - /// - public static class User32 - { - private static readonly ILog LOG = LogManager.GetLogger(typeof(User32)); - private static bool _CanCallGetPhysicalCursorPos = true; - public const int SC_RESTORE = 0xF120; - public const int SC_MAXIMIZE = 0xF030; - public const int SC_MINIMIZE = 0xF020; - - // For MonitorFromWindow - public const int MONITOR_DEFAULTTONULL = 0; - public const int MONITOR_DEFAULTTONEAREST = 2; - public const int CURSOR_SHOWING = 0x00000001; - - /// - /// Determines whether the specified window handle identifies an existing window. - /// - /// A handle to the window to be tested. - /// - /// If the window handle identifies an existing window, the return value is true. - /// If the window handle does not identify an existing window, the return value is false. - /// - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool IsWindow(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool IsWindowVisible(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); - - [DllImport("user32", SetLastError = true)] - public static extern int GetWindowThreadProcessId(IntPtr hWnd, IntPtr processId); - - [DllImport("user32")] - public static extern IntPtr AttachThreadInput(int idAttach, int idAttachTo, int fAttach); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr GetParent(IntPtr hWnd); - - [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int cch); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool BringWindowToTop(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr GetForegroundWindow(); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr GetDesktopWindow(); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool SetForegroundWindow(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetWindowPlacement(IntPtr hWnd, ref WindowPlacement lpwndpl); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool SetWindowPlacement(IntPtr hWnd, [In] ref WindowPlacement lpwndpl); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool IsIconic(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool IsZoomed(IntPtr hWnd); - - [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); - - [DllImport("user32", SetLastError = true)] - public static extern uint GetClassLong(IntPtr hWnd, int nIndex); - - [DllImport("user32", SetLastError = true, EntryPoint = "GetClassLongPtr")] - public static extern IntPtr GetClassLongPtr(IntPtr hWnd, int nIndex); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool PrintWindow(IntPtr hWnd, IntPtr hDc, uint nFlags); - - [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); - - [DllImport("user32", SetLastError = true, EntryPoint = "GetWindowLong")] - public static extern int GetWindowLong(IntPtr hWnd, int index); - - [DllImport("user32", SetLastError = true, EntryPoint = "GetWindowLongPtr")] - public static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); - - [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] - public static extern int SetWindowLong(IntPtr hWnd, int index, int styleFlags); - - [DllImport("user32", SetLastError = true, EntryPoint = "SetWindowLongPtr")] - public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int index, IntPtr styleFlags); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr MonitorFromWindow(IntPtr hWnd, MonitorFrom dwFlags); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr MonitorFromRect([In] ref RECT lprc, uint dwFlags); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool GetWindowInfo(IntPtr hWnd, ref WindowInfo pwi); - - [DllImport("user32", SetLastError = true)] - public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); - - [DllImport("user32", SetLastError = true)] - public static extern RegionResult GetWindowRgn(IntPtr hWnd, SafeHandle hRgn); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, WindowPos uFlags); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr GetClipboardOwner(); - - // Added for finding Metro apps, Greenshot 1.1 - [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); - - [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow); - - /// uiFlags: 0 - Count of GDI objects - /// uiFlags: 1 - Count of USER objects - /// - Win32 GDI objects (pens, brushes, fonts, palettes, regions, device contexts, bitmap headers) - /// - Win32 USER objects: - /// - WIN32 resources (accelerator tables, bitmap resources, dialog box templates, font resources, menu resources, raw data resources, string table entries, message table entries, cursors/icons) - /// - Other USER objects (windows, menus) - /// - [DllImport("user32", SetLastError = true)] - public static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags); - - [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern uint RegisterWindowMessage(string lpString); - - [DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)] - public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags fuFlags, uint uTimeout, out UIntPtr lpdwResult); - - [DllImport("user32", SetLastError = true)] - private static extern bool GetPhysicalCursorPos(out POINT cursorLocation); - - /// - /// The following is used for Icon handling - /// - /// - /// - [DllImport("user32", SetLastError = true)] - public static extern SafeIconHandle CopyIcon(IntPtr hIcon); - - [DllImport("user32", SetLastError = true)] - public static extern bool DestroyIcon(IntPtr hIcon); - - [DllImport("user32", SetLastError = true)] - public static extern bool GetCursorInfo(out CursorInfo cursorInfo); - - [DllImport("user32", SetLastError = true)] - public static extern bool GetIconInfo(SafeIconHandle iconHandle, out IconInfo iconInfo); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr SetCapture(IntPtr hWnd); - - [DllImport("user32", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool ReleaseCapture(); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr CreateIconIndirect(ref IconInfo icon); - - [DllImport("user32", SetLastError = true)] - public static extern IntPtr OpenInputDesktop(uint dwFlags, bool fInherit, DesktopAccessRight dwDesiredAccess); - - [DllImport("user32", SetLastError = true)] - public static extern bool SetThreadDesktop(IntPtr hDesktop); - - [DllImport("user32", SetLastError = true)] - public static extern bool CloseDesktop(IntPtr hDesktop); - - /// - /// Retrieves the cursor location safely, accounting for DPI settings in Vista/Windows 7. - /// - /// Point with cursor location, relative to the origin of the monitor setup - /// (i.e. negative coordinates arepossible in multiscreen setups) - public static Point GetCursorLocation() - { - if (Environment.OSVersion.Version.Major >= 6 && _CanCallGetPhysicalCursorPos) - { - try - { - if (GetPhysicalCursorPos(out var cursorLocation)) - { - return new Point(cursorLocation.X, cursorLocation.Y); - } - - Win32Error error = Win32.GetLastErrorCode(); - LOG.ErrorFormat("Error retrieving PhysicalCursorPos : {0}", Win32.GetMessage(error)); - } - catch (Exception ex) - { - LOG.Error("Exception retrieving PhysicalCursorPos, no longer calling this. Cause :", ex); - _CanCallGetPhysicalCursorPos = false; - } - } - - return new Point(Cursor.Position.X, Cursor.Position.Y); - } - - /// - /// Wrapper for the GetClassLong which decides if the system is 64-bit or not and calls the right one. - /// - /// IntPtr - /// int - /// IntPtr - public static IntPtr GetClassLongWrapper(IntPtr hWnd, int nIndex) - { - if (IntPtr.Size > 4) - { - return GetClassLongPtr(hWnd, nIndex); - } - else - { - return new IntPtr(GetClassLong(hWnd, nIndex)); - } - } - - /// - /// Wrapper for the GetWindowLong which decides if the system is 64-bit or not and calls the right one. - /// - /// - /// - /// - public static long GetWindowLongWrapper(IntPtr hWnd, int nIndex) - { - if (IntPtr.Size == 8) - { - return GetWindowLongPtr(hWnd, nIndex).ToInt64(); - } - else - { - return GetWindowLong(hWnd, nIndex); - } - } - - /// - /// Wrapper for the SetWindowLong which decides if the system is 64-bit or not and calls the right one. - /// - /// - /// - /// - public static void SetWindowLongWrapper(IntPtr hWnd, int nIndex, IntPtr styleFlags) - { - if (IntPtr.Size == 8) - { - SetWindowLongPtr(hWnd, nIndex, styleFlags); - } - else - { - SetWindowLong(hWnd, nIndex, styleFlags.ToInt32()); - } - } - - public static uint GetGuiResourcesGDICount() - { - using var currentProcess = Process.GetCurrentProcess(); - return GetGuiResources(currentProcess.Handle, 0); - } - - public static uint GetGuiResourcesUserCount() - { - using var currentProcess = Process.GetCurrentProcess(); - return GetGuiResources(currentProcess.Handle, 1); - } - - /// - /// Helper method to create a Win32 exception with the windows message in it - /// - /// string with current method - /// Exception - public static Exception CreateWin32Exception(string method) - { - var exceptionToThrow = new Win32Exception(); - exceptionToThrow.Data.Add("Method", method); - return exceptionToThrow; - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Win32.cs b/src/Greenshot.Base/UnmanagedHelpers/Win32.cs deleted file mode 100644 index d5b3def78..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/Win32.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Runtime.InteropServices; -using System.Text; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.UnmanagedHelpers -{ - public static class Win32 - { - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer, int nSize, IntPtr arguments); - - [DllImport("kernel32.dll")] - public static extern void SetLastError(uint dwErrCode); - - public static Win32Error GetLastErrorCode() - { - return (Win32Error) Marshal.GetLastWin32Error(); - } - - public static string GetMessage(Win32Error errorCode) - { - var buffer = new StringBuilder(0x100); - - if (FormatMessage(0x3200, IntPtr.Zero, (uint) errorCode, 0, buffer, buffer.Capacity, IntPtr.Zero) == 0) - { - return "Unknown error (0x" + ((int) errorCode).ToString("x") + ")"; - } - - var result = new StringBuilder(); - int i = 0; - - while (i < buffer.Length) - { - if (!char.IsLetterOrDigit(buffer[i]) && - !char.IsPunctuation(buffer[i]) && - !char.IsSymbol(buffer[i]) && - !char.IsWhiteSpace(buffer[i])) - break; - - result.Append(buffer[i]); - i++; - } - - return result.ToString().Replace("\r\n", string.Empty); - } - } -} \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/WinEventDelegate.cs b/src/Greenshot.Base/UnmanagedHelpers/WinEventDelegate.cs deleted file mode 100644 index bd54923f7..000000000 --- a/src/Greenshot.Base/UnmanagedHelpers/WinEventDelegate.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Greenshot.Base.UnmanagedHelpers.Enums; - -namespace Greenshot.Base.UnmanagedHelpers -{ - /// - /// Used with SetWinEventHook - /// - /// - /// - /// - /// - /// - /// - /// - public delegate void WinEventDelegate(IntPtr hWinEventHook, WinEvent eventType, IntPtr hWnd, EventObjects idObject, int idChild, uint dwEventThread, uint dwmsEventTime); -} \ No newline at end of file diff --git a/src/Greenshot.Editor/Configuration/EditorConfiguration.cs b/src/Greenshot.Editor/Configuration/EditorConfiguration.cs index c36794a5d..3a516797c 100644 --- a/src/Greenshot.Editor/Configuration/EditorConfiguration.cs +++ b/src/Greenshot.Editor/Configuration/EditorConfiguration.cs @@ -22,11 +22,12 @@ using System; using System.Collections.Generic; using System.Drawing; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.User32.Enums; +using Dapplo.Windows.User32.Structs; using Greenshot.Base.Effects; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Base.UnmanagedHelpers.Structs; using Greenshot.Editor.Drawing.Fields; namespace Greenshot.Editor.Configuration @@ -50,24 +51,21 @@ namespace Greenshot.Editor.Configuration public WindowPlacementFlags WindowPlacementFlags { get; set; } [IniProperty("WindowShowCommand", Description = "Show command", DefaultValue = "Normal")] - public ShowWindowCommand ShowWindowCommand { get; set; } + public ShowWindowCommands ShowWindowCommand { get; set; } [IniProperty("WindowMinPosition", Description = "Position of minimized window", DefaultValue = "-1,-1")] - public Point WindowMinPosition { get; set; } + public NativePoint WindowMinPosition { get; set; } [IniProperty("WindowMaxPosition", Description = "Position of maximized window", DefaultValue = "-1,-1")] - public Point WindowMaxPosition { get; set; } + public NativePoint WindowMaxPosition { get; set; } [IniProperty("WindowNormalPosition", Description = "Position of normal window", DefaultValue = "100,100,400,400")] - public Rectangle WindowNormalPosition { get; set; } + public NativeRect WindowNormalPosition { get; set; } [IniProperty("ReuseEditor", Description = "Reuse already open editor", DefaultValue = "false")] public bool ReuseEditor { get; set; } - [IniProperty("FreehandSensitivity", - Description = - "The smaller this number, the less smoothing is used. Decrease for detailed drawing, e.g. when using a pen. Increase for smoother lines. e.g. when you want to draw a smooth line.", - DefaultValue = "3")] + [IniProperty("FreehandSensitivity", Description = "The smaller this number, the less smoothing is used. Decrease for detailed drawing, e.g. when using a pen. Increase for smoother lines. e.g. when you want to draw a smooth line. Minimal value is 1, max is 2147483647.", DefaultValue = "3")] public int FreehandSensitivity { get; set; } [IniProperty("SuppressSaveDialogAtClose", Description = "Suppressed the 'do you want to save' dialog when closing the editor.", DefaultValue = "False")] @@ -80,15 +78,17 @@ namespace Greenshot.Editor.Configuration public TornEdgeEffect TornEdgeEffectSettings { get; set; } [IniProperty("DefaultEditorSize", Description = "The size for the editor when it's opened without a capture", DefaultValue = "500,500")] - public Size DefaultEditorSize { get; set; } + public NativeSize DefaultEditorSize { get; set; } public override void AfterLoad() { base.AfterLoad(); - if (RecentColors == null) + RecentColors ??= new List(); + + if (FreehandSensitivity < 1) { - RecentColors = new List(); + FreehandSensitivity = 1; } } @@ -137,10 +137,7 @@ namespace Greenshot.Editor.Configuration { string requestedField = field.Scope + "." + field.FieldType.Name; // Check if the configuration exists - if (LastUsedFieldValues == null) - { - LastUsedFieldValues = new Dictionary(); - } + LastUsedFieldValues ??= new Dictionary(); // check if settings for the requesting type exist, if not create! if (LastUsedFieldValues.ContainsKey(requestedField)) @@ -155,19 +152,19 @@ namespace Greenshot.Editor.Configuration public void ResetEditorPlacement() { - WindowNormalPosition = new Rectangle(100, 100, 400, 400); - WindowMaxPosition = new Point(-1, -1); - WindowMinPosition = new Point(-1, -1); + WindowNormalPosition = new NativeRect(100, 100, 400, 400); + WindowMaxPosition = new NativePoint(-1, -1); + WindowMinPosition = new NativePoint(-1, -1); WindowPlacementFlags = 0; - ShowWindowCommand = ShowWindowCommand.Normal; + ShowWindowCommand = ShowWindowCommands.Normal; } public WindowPlacement GetEditorPlacement() { - WindowPlacement placement = WindowPlacement.Default; - placement.NormalPosition = new RECT(WindowNormalPosition); - placement.MaxPosition = new POINT(WindowMaxPosition); - placement.MinPosition = new POINT(WindowMinPosition); + WindowPlacement placement = WindowPlacement.Create(); + placement.NormalPosition = WindowNormalPosition; + placement.MaxPosition = WindowMaxPosition; + placement.MinPosition = WindowMinPosition; placement.ShowCmd = ShowWindowCommand; placement.Flags = WindowPlacementFlags; return placement; @@ -175,9 +172,9 @@ namespace Greenshot.Editor.Configuration public void SetEditorPlacement(WindowPlacement placement) { - WindowNormalPosition = placement.NormalPosition.ToRectangle(); - WindowMaxPosition = placement.MaxPosition.ToPoint(); - WindowMinPosition = placement.MinPosition.ToPoint(); + WindowNormalPosition = placement.NormalPosition; + WindowMaxPosition = placement.MaxPosition; + WindowMinPosition = placement.MinPosition; ShowWindowCommand = placement.ShowCmd; WindowPlacementFlags = placement.Flags; } diff --git a/src/Greenshot.Editor/Configuration/LanguageKeys.cs b/src/Greenshot.Editor/Configuration/LanguageKeys.cs index f15b113d4..b1f410e66 100644 --- a/src/Greenshot.Editor/Configuration/LanguageKeys.cs +++ b/src/Greenshot.Editor/Configuration/LanguageKeys.cs @@ -33,6 +33,7 @@ namespace Greenshot.Editor.Configuration contextmenu_capturefullscreen_right, contextmenu_capturefullscreen_bottom, contextmenu_captureie, + editor_autocrop_not_possible, editor_clipboardfailed, editor_close_on_save, editor_close_on_save_title, diff --git a/src/Greenshot.Editor/Controls/ColorButton.cs b/src/Greenshot.Editor/Controls/ColorButton.cs index 849395330..9e968afbc 100644 --- a/src/Greenshot.Editor/Controls/ColorButton.cs +++ b/src/Greenshot.Editor/Controls/ColorButton.cs @@ -24,6 +24,7 @@ using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Controls; using ColorDialog = Greenshot.Editor.Forms.ColorDialog; @@ -65,7 +66,7 @@ namespace Greenshot.Editor.Controls if (Image != null) { using Graphics graphics = Graphics.FromImage(Image); - graphics.FillRectangle(brush, new Rectangle(4, 17, 16, 3)); + graphics.FillRectangle(brush, new NativeRect(4, 17, 16, 3)); } // cleanup GDI Object diff --git a/src/Greenshot.Editor/Controls/FontFamilyComboBox.cs b/src/Greenshot.Editor/Controls/FontFamilyComboBox.cs index b57d52e75..cabb40e49 100644 --- a/src/Greenshot.Editor/Controls/FontFamilyComboBox.cs +++ b/src/Greenshot.Editor/Controls/FontFamilyComboBox.cs @@ -23,6 +23,7 @@ using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Editor.Controls { @@ -113,12 +114,12 @@ namespace Greenshot.Editor.Controls /// /// Helper method to draw the string /// - /// - /// - /// - /// - /// - private void DrawText(Graphics graphics, FontFamily fontFamily, FontStyle fontStyle, Rectangle bounds, string text) + /// Graphics + /// FontFamily + /// FontStyle + /// NativeRect + /// string + private void DrawText(Graphics graphics, FontFamily fontFamily, FontStyle fontStyle, NativeRect bounds, string text) { using Font font = new Font(fontFamily, Font.Size + 5, fontStyle, GraphicsUnit.Pixel); // Make sure the text is visible by centering it in the line diff --git a/src/Greenshot.Editor/Controls/MenuStripEx.cs b/src/Greenshot.Editor/Controls/MenuStripEx.cs index 9af1da2cf..c140416f6 100644 --- a/src/Greenshot.Editor/Controls/MenuStripEx.cs +++ b/src/Greenshot.Editor/Controls/MenuStripEx.cs @@ -21,7 +21,7 @@ using System; using System.Windows.Forms; -using Greenshot.Base.UnmanagedHelpers.Enums; +using Dapplo.Windows.Messages.Enumerations; namespace Greenshot.Editor.Controls { diff --git a/src/Greenshot.Editor/Controls/Pipette.cs b/src/Greenshot.Editor/Controls/Pipette.cs index d31017b92..dc1ae1046 100644 --- a/src/Greenshot.Editor/Controls/Pipette.cs +++ b/src/Greenshot.Editor/Controls/Pipette.cs @@ -23,8 +23,11 @@ using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Icons; +using Dapplo.Windows.Icons.SafeHandles; +using Dapplo.Windows.Messages.Enumerations; +using Dapplo.Windows.User32; using Greenshot.Editor.Forms; using ColorDialog = Greenshot.Editor.Forms.ColorDialog; @@ -65,11 +68,10 @@ namespace Greenshot.Editor.Controls private static Cursor CreateCursor(Bitmap bitmap, int hotspotX, int hotspotY) { using SafeIconHandle iconHandle = new SafeIconHandle(bitmap.GetHicon()); - User32.GetIconInfo(iconHandle, out var iconInfo); - iconInfo.xHotspot = hotspotX; - iconInfo.yHotspot = hotspotY; - iconInfo.fIcon = false; - var icon = User32.CreateIconIndirect(ref iconInfo); + NativeIconMethods.GetIconInfo(iconHandle, out var iconInfo); + iconInfo.Hotspot = new NativePoint(hotspotX, hotspotY); + iconInfo.IsIcon = false; + var icon = NativeIconMethods.CreateIconIndirect(ref iconInfo); return new Cursor(icon); } @@ -110,7 +112,7 @@ namespace Greenshot.Editor.Controls { if (e.Button == MouseButtons.Left) { - User32.SetCapture(Handle); + User32Api.SetCapture(Handle); _movableShowColorForm.MoveTo(PointToScreen(new Point(e.X, e.Y))); } @@ -126,8 +128,8 @@ namespace Greenshot.Editor.Controls if (e.Button == MouseButtons.Left) { //Release Capture should consume MouseUp when canceled with the escape key - User32.ReleaseCapture(); - PipetteUsed?.Invoke(this, new PipetteUsedArgs(_movableShowColorForm.color)); + User32Api.ReleaseCapture(); + PipetteUsed?.Invoke(this, new PipetteUsedArgs(_movableShowColorForm.Color)); } base.OnMouseUp(e); @@ -183,7 +185,7 @@ namespace Greenshot.Editor.Controls { if ((int) m.WParam == VkEsc) { - User32.ReleaseCapture(); + User32Api.ReleaseCapture(); } } } diff --git a/src/Greenshot.Editor/Controls/ToolStripColorButton.cs b/src/Greenshot.Editor/Controls/ToolStripColorButton.cs index 91386b4f4..eb05a0fcc 100644 --- a/src/Greenshot.Editor/Controls/ToolStripColorButton.cs +++ b/src/Greenshot.Editor/Controls/ToolStripColorButton.cs @@ -24,6 +24,7 @@ using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Controls; using ColorDialog = Greenshot.Editor.Forms.ColorDialog; @@ -63,7 +64,7 @@ namespace Greenshot.Editor.Controls if (Image != null) { using Graphics graphics = Graphics.FromImage(Image); - graphics.FillRectangle(brush, new Rectangle(0, 13, 16, 3)); + graphics.FillRectangle(brush, new NativeRect(0, 13, 16, 3)); } // cleanup GDI Object diff --git a/src/Greenshot.Editor/Destinations/EditorDestination.cs b/src/Greenshot.Editor/Destinations/EditorDestination.cs index 326397ec9..bfc143d88 100644 --- a/src/Greenshot.Editor/Destinations/EditorDestination.cs +++ b/src/Greenshot.Editor/Destinations/EditorDestination.cs @@ -64,7 +64,7 @@ namespace Greenshot.Editor.Destinations return Language.GetString(LangKey.settings_destination_editor); } - return Language.GetString(LangKey.settings_destination_editor) + " - " + editor.CaptureDetails.Title; + return Language.GetString(LangKey.settings_destination_editor) + " - " + editor.CaptureDetails.Title?.Substring(0, Math.Min(20, editor.CaptureDetails.Title.Length)); } } diff --git a/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs index 028306e24..a2dd980a6 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs @@ -22,7 +22,9 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; -using Greenshot.Base.Core; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Dpi; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Drawing.Adorners; @@ -32,12 +34,17 @@ namespace Greenshot.Editor.Drawing.Adorners { public virtual EditStatus EditStatus { get; protected set; } = EditStatus.IDLE; - private static readonly Size DefaultSize = new Size(6, 6); - protected Size _size; + private static readonly NativeSize DefaultSize = new(6, 6); + + protected NativeSize Size + { + get; + set; + } public AbstractAdorner(IDrawableContainer owner) { - _size = DpiHelper.ScaleWithDpi(DefaultSize, 0); + Size = DpiCalculator.ScaleWithDpi(DefaultSize, owner?.Parent?.CurrentDpi ?? 96); Owner = owner; } @@ -49,17 +56,16 @@ namespace Greenshot.Editor.Drawing.Adorners get { return Cursors.SizeAll; } } - public virtual IDrawableContainer Owner { get; set; } + public IDrawableContainer Owner { get; set; } /// /// Test if the point is inside the adorner /// - /// - /// - public virtual bool HitTest(Point point) + /// NativePoint + /// bool + public virtual bool HitTest(NativePoint point) { - Rectangle hitBounds = Bounds; - hitBounds.Inflate(3, 3); + NativeRect hitBounds = Bounds.Inflate(3, 3); return hitBounds.Contains(point); } @@ -94,29 +100,29 @@ namespace Greenshot.Editor.Drawing.Adorners /// /// Return the location of the adorner /// - public virtual Point Location { get; set; } + public virtual NativePoint Location { get; set; } /// /// Return the bounds of the Adorner /// - public virtual Rectangle Bounds + public virtual NativeRect Bounds { get { - Point location = Location; - return new Rectangle(location.X - (_size.Width / 2), location.Y - (_size.Height / 2), _size.Width, _size.Height); + NativePoint location = Location; + return new NativeRect(location.X - (Size.Width / 2), location.Y - (Size.Height / 2), Size.Width, Size.Height); } } /// /// Return the bounds of the Adorner as displayed on the parent Surface /// - protected virtual Rectangle BoundsOnSurface + protected virtual NativeRect BoundsOnSurface { get { - Point displayLocation = Owner.Parent.ToSurfaceCoordinates(Location); - return new Rectangle(displayLocation.X - _size.Width / 2, displayLocation.Y - _size.Height / 2, _size.Width, _size.Height); + NativePoint displayLocation = Owner.Parent.ToSurfaceCoordinates(Location); + return new NativeRect(displayLocation.X - Size.Width / 2, displayLocation.Y - Size.Height / 2, Size.Width, Size.Height); } } @@ -132,17 +138,41 @@ namespace Greenshot.Editor.Drawing.Adorners /// Adjust UI elements to the supplied DPI settings /// /// uint - public void AdjustToDpi(uint dpi) + public void AdjustToDpi(int dpi) { - _size = DpiHelper.ScaleWithDpi(DefaultSize, dpi); + Size = DpiCalculator.ScaleWithDpi(DefaultSize, dpi); } + public Color OutlineColor { get; set; } = Color.White; + public Color FillColor { get; set; } = Color.Black; + /// /// Draw the adorner /// /// PaintEventArgs public virtual void Paint(PaintEventArgs paintEventArgs) { + Graphics targetGraphics = paintEventArgs.Graphics; + + var bounds = BoundsOnSurface; + GraphicsState state = targetGraphics.Save(); + + targetGraphics.CompositingMode = CompositingMode.SourceCopy; + + try + { + using var fillBrush = new SolidBrush(FillColor); + targetGraphics.FillRectangle(fillBrush, bounds); + using var lineBrush = new SolidBrush(OutlineColor); + using var pen = new Pen(lineBrush); + targetGraphics.DrawRectangle(pen, bounds); + } + catch + { + // Ignore, BUG-2065 + } + + targetGraphics.Restore(state); } /// @@ -152,5 +182,10 @@ namespace Greenshot.Editor.Drawing.Adorners public virtual void Transform(Matrix matrix) { } + + /// + /// This is to TAG the adorner so we know the type + /// + public string Tag { get; set; } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs index ad1355ced..61fc8de11 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs @@ -20,8 +20,8 @@ */ using System.Drawing; -using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Helpers; @@ -32,8 +32,8 @@ namespace Greenshot.Editor.Drawing.Adorners /// public class MoveAdorner : AbstractAdorner { - private Rectangle _boundsBeforeResize = Rectangle.Empty; - private RectangleF _boundsAfterResize = RectangleF.Empty; + private NativeRect _boundsBeforeResize = NativeRect.Empty; + private NativeRectFloat _boundsAfterResize = NativeRectFloat.Empty; public Positions Position { get; private set; } @@ -55,7 +55,7 @@ namespace Greenshot.Editor.Drawing.Adorners public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) { EditStatus = EditStatus.RESIZING; - _boundsBeforeResize = new Rectangle(Owner.Left, Owner.Top, Owner.Width, Owner.Height); + _boundsBeforeResize = new NativeRect(Owner.Left, Owner.Top, Owner.Width, Owner.Height); _boundsAfterResize = _boundsBeforeResize; } @@ -75,13 +75,10 @@ namespace Greenshot.Editor.Drawing.Adorners Owner.MakeBoundsChangeUndoable(false); // reset "workbench" rectangle to current bounds - _boundsAfterResize.X = _boundsBeforeResize.X; - _boundsAfterResize.Y = _boundsBeforeResize.Y; - _boundsAfterResize.Width = _boundsBeforeResize.Width; - _boundsAfterResize.Height = _boundsBeforeResize.Height; + _boundsAfterResize = _boundsBeforeResize; // calculate scaled rectangle - ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(mouseEventArgs.X, mouseEventArgs.Y), ScaleHelper.GetScaleOptions()); + _boundsAfterResize = ScaleHelper.Scale(_boundsAfterResize, Position, new PointF(mouseEventArgs.X, mouseEventArgs.Y), ScaleHelper.GetScaleOptions()); // apply scaled bounds to this DrawableContainer Owner.ApplyBounds(_boundsAfterResize); @@ -92,7 +89,7 @@ namespace Greenshot.Editor.Drawing.Adorners /// /// Return the location of the adorner /// - public override Point Location + public override NativePoint Location { get { @@ -133,34 +130,8 @@ namespace Greenshot.Editor.Drawing.Adorners break; } - return new Point(x, y); + return new NativePoint(x, y); } } - - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - GraphicsState state = targetGraphics.Save(); - - targetGraphics.CompositingMode = CompositingMode.SourceCopy; - - try - { - targetGraphics.FillRectangle(Brushes.Black, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - } - catch - { - // Ignore, BUG-2065 - } - - targetGraphics.Restore(state); - } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs index 052abaaa4..263d5a31e 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs @@ -20,8 +20,8 @@ */ using System.Drawing; -using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Helpers; @@ -32,8 +32,8 @@ namespace Greenshot.Editor.Drawing.Adorners /// public class ResizeAdorner : AbstractAdorner { - private Rectangle _boundsBeforeResize = Rectangle.Empty; - private RectangleF _boundsAfterResize = RectangleF.Empty; + private NativeRect _boundsBeforeResize = NativeRect.Empty; + private NativeRectFloat _boundsAfterResize = NativeRectFloat.Empty; public Positions Position { get; private set; } @@ -55,23 +55,18 @@ namespace Greenshot.Editor.Drawing.Adorners isNotSwitched = !isNotSwitched; } - switch (Position) + return Position switch { - case Positions.TopLeft: - case Positions.BottomRight: - return isNotSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW; - case Positions.TopRight: - case Positions.BottomLeft: - return isNotSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE; - case Positions.MiddleLeft: - case Positions.MiddleRight: - return Cursors.SizeWE; - case Positions.TopCenter: - case Positions.BottomCenter: - return Cursors.SizeNS; - default: - return Cursors.SizeAll; - } + Positions.TopLeft => isNotSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW, + Positions.BottomRight => isNotSwitched ? Cursors.SizeNWSE : Cursors.SizeNESW, + Positions.TopRight => isNotSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE, + Positions.BottomLeft => isNotSwitched ? Cursors.SizeNESW : Cursors.SizeNWSE, + Positions.MiddleLeft => Cursors.SizeWE, + Positions.MiddleRight => Cursors.SizeWE, + Positions.TopCenter => Cursors.SizeNS, + Positions.BottomCenter => Cursors.SizeNS, + _ => Cursors.SizeAll + }; } } @@ -83,7 +78,7 @@ namespace Greenshot.Editor.Drawing.Adorners public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) { EditStatus = EditStatus.RESIZING; - _boundsBeforeResize = new Rectangle(Owner.Left, Owner.Top, Owner.Width, Owner.Height); + _boundsBeforeResize = new NativeRect(Owner.Left, Owner.Top, Owner.Width, Owner.Height); _boundsAfterResize = _boundsBeforeResize; } @@ -103,13 +98,12 @@ namespace Greenshot.Editor.Drawing.Adorners Owner.MakeBoundsChangeUndoable(false); // reset "workbench" rectangle to current bounds - _boundsAfterResize.X = _boundsBeforeResize.X; - _boundsAfterResize.Y = _boundsBeforeResize.Y; - _boundsAfterResize.Width = _boundsBeforeResize.Width; - _boundsAfterResize.Height = _boundsBeforeResize.Height; + _boundsAfterResize = _boundsBeforeResize; + + var scaleOptions = (Owner as IHaveScaleOptions)?.GetScaleOptions(); // calculate scaled rectangle - ScaleHelper.Scale(ref _boundsAfterResize, Position, new PointF(mouseEventArgs.X, mouseEventArgs.Y), ScaleHelper.GetScaleOptions()); + _boundsAfterResize = ScaleHelper.Scale(_boundsAfterResize, Position, new NativePointFloat(mouseEventArgs.X, mouseEventArgs.Y), scaleOptions); // apply scaled bounds to this DrawableContainer Owner.ApplyBounds(_boundsAfterResize); @@ -120,7 +114,7 @@ namespace Greenshot.Editor.Drawing.Adorners /// /// Return the location of the adorner /// - public override Point Location + public override NativePoint Location { get { @@ -164,23 +158,5 @@ namespace Greenshot.Editor.Drawing.Adorners return new Point(x, y); } } - - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - GraphicsState state = targetGraphics.Save(); - - targetGraphics.CompositingMode = CompositingMode.SourceCopy; - - targetGraphics.FillRectangle(Brushes.Black, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - targetGraphics.Restore(state); - } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs index 0dec40a5f..864ff28c5 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs @@ -22,25 +22,29 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Interfaces.Drawing; namespace Greenshot.Editor.Drawing.Adorners { /// - /// This implements the special "gripper" for the Speech-Bubble tail + /// This implements the special target "gripper", e.g. used for the Speech-Bubble tail /// - public class TargetAdorner : AbstractAdorner + public sealed class TargetAdorner : AbstractAdorner { - public TargetAdorner(IDrawableContainer owner, Point location) : base(owner) + public TargetAdorner(IDrawableContainer owner, Point location, Color? fillColor = null, Color? outlineColor = null) : base(owner) { Location = location; + FillColor = fillColor ?? Color.Green; + OutlineColor = outlineColor ?? Color.White; } /// /// Handle the mouse down /// - /// - /// + /// object + /// MouseEventArgs public override void MouseDown(object sender, MouseEventArgs mouseEventArgs) { EditStatus = EditStatus.MOVING; @@ -49,8 +53,8 @@ namespace Greenshot.Editor.Drawing.Adorners /// /// Handle the mouse move /// - /// - /// + /// object + /// MouseEventArgs public override void MouseMove(object sender, MouseEventArgs mouseEventArgs) { if (EditStatus != EditStatus.MOVING) @@ -59,30 +63,30 @@ namespace Greenshot.Editor.Drawing.Adorners } Owner.Invalidate(); - Point newGripperLocation = new Point(mouseEventArgs.X, mouseEventArgs.Y); - Rectangle imageBounds = new Rectangle(0, 0, Owner.Parent.Image.Width, Owner.Parent.Image.Height); + NativePoint newGripperLocation = new NativePoint(mouseEventArgs.X, mouseEventArgs.Y); + NativeRect imageBounds = new NativeRect(0, 0, Owner.Parent.Image.Width, Owner.Parent.Image.Height); // Check if gripper inside the parent (surface), if not we need to move it inside // This was made for BUG-1682 if (!imageBounds.Contains(newGripperLocation)) { if (newGripperLocation.X > imageBounds.Right) { - newGripperLocation.X = imageBounds.Right - 5; + newGripperLocation = newGripperLocation.ChangeX(imageBounds.Right - 5); } if (newGripperLocation.X < imageBounds.Left) { - newGripperLocation.X = imageBounds.Left; + newGripperLocation = newGripperLocation.ChangeX(imageBounds.Left); } if (newGripperLocation.Y > imageBounds.Bottom) { - newGripperLocation.Y = imageBounds.Bottom - 5; + newGripperLocation = newGripperLocation.ChangeY(imageBounds.Bottom - 5); } if (newGripperLocation.Y < imageBounds.Top) { - newGripperLocation.Y = imageBounds.Top; + newGripperLocation = newGripperLocation.ChangeY(imageBounds.Top); } } @@ -90,19 +94,6 @@ namespace Greenshot.Editor.Drawing.Adorners Owner.Invalidate(); } - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - targetGraphics.FillRectangle(Brushes.Green, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - } - /// /// Made sure this adorner is transformed /// @@ -114,7 +105,7 @@ namespace Greenshot.Editor.Drawing.Adorners return; } - Point[] points = new[] + Point[] points = new Point[] { Location }; diff --git a/src/Greenshot.Editor/Drawing/ArrowContainer.cs b/src/Greenshot.Editor/Drawing/ArrowContainer.cs index f285d28bc..91c76366b 100644 --- a/src/Greenshot.Editor/Drawing/ArrowContainer.cs +++ b/src/Greenshot.Editor/Drawing/ArrowContainer.cs @@ -22,6 +22,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; @@ -43,7 +46,7 @@ namespace Greenshot.Editor.Drawing private static readonly AdjustableArrowCap ARROW_CAP = new AdjustableArrowCap(4, 6); - public ArrowContainer(Surface parent) : base(parent) + public ArrowContainer(ISurface parent) : base(parent) { } @@ -65,44 +68,40 @@ namespace Greenshot.Editor.Drawing int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - if (lineThickness > 0) + if (lineThickness <= 0) return; + + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.None; + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + ArrowHeadCombination heads = (ArrowHeadCombination) GetFieldValue(FieldType.ARROWHEADS); + if (shadow) { - graphics.SmoothingMode = SmoothingMode.HighQuality; - graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.None; - Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); - ArrowHeadCombination heads = (ArrowHeadCombination) GetFieldValue(FieldType.ARROWHEADS); - if (lineThickness > 0) + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = 1; + while (currentStep <= steps) { - if (shadow) - { - //draw shadow first - int basealpha = 100; - int alpha = basealpha; - int steps = 5; - int currentStep = 1; - while (currentStep <= steps) - { - using Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); - SetArrowHeads(heads, shadowCapPen); + using Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); + SetArrowHeads(heads, shadowCapPen); - graphics.DrawLine(shadowCapPen, - Left + currentStep, - Top + currentStep, - Left + currentStep + Width, - Top + currentStep + Height); + graphics.DrawLine(shadowCapPen, + Left + currentStep, + Top + currentStep, + Left + currentStep + Width, + Top + currentStep + Height); - currentStep++; - alpha -= basealpha / steps; - } - } - - using Pen pen = new Pen(lineColor, lineThickness); - SetArrowHeads(heads, pen); - graphics.DrawLine(pen, Left, Top, Left + Width, Top + Height); + currentStep++; + alpha -= basealpha / steps; } } + + using Pen pen = new Pen(lineColor, lineThickness); + SetArrowHeads(heads, pen); + graphics.DrawLine(pen, Left, Top, Left + Width, Top + Height); } private void SetArrowHeads(ArrowHeadCombination heads, Pen pen) @@ -118,7 +117,7 @@ namespace Greenshot.Editor.Drawing } } - public override Rectangle DrawingBounds + public override NativeRect DrawingBounds { get { @@ -133,12 +132,11 @@ namespace Greenshot.Editor.Drawing using GraphicsPath path = new GraphicsPath(); path.AddLine(Left, Top, Left + Width, Top + Height); using Matrix matrix = new Matrix(); - Rectangle drawingBounds = Rectangle.Round(path.GetBounds(matrix, pen)); - drawingBounds.Inflate(2, 2); - return drawingBounds; + NativeRect drawingBounds = Rectangle.Round(path.GetBounds(matrix, pen)); + return drawingBounds.Inflate(2, 2); } - return Rectangle.Empty; + return NativeRect.Empty; } } diff --git a/src/Greenshot.Editor/Drawing/CropContainer.cs b/src/Greenshot.Editor/Drawing/CropContainer.cs index 1aa4e06c2..eb2f7179e 100644 --- a/src/Greenshot.Editor/Drawing/CropContainer.cs +++ b/src/Greenshot.Editor/Drawing/CropContainer.cs @@ -19,9 +19,14 @@ * along with this program. If not, see . */ + using System.Drawing; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Editor.Drawing.Adorners; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Helpers; @@ -32,7 +37,30 @@ namespace Greenshot.Editor.Drawing /// public class CropContainer : DrawableContainer { - public CropContainer(Surface parent) : base(parent) + /// + /// Available Crop modes + /// + public enum CropModes + { + /// + /// crop all outside the selection rectangle + /// + Default, + /// + /// like default, but initially creates the selection rectangle + /// + AutoCrop, + /// + /// crop all inside the selection, anchors the selection to the top and bottom edges + /// + Vertical, + /// + /// crop all inside the selection, anchors the selection to the left and right edges + /// + Horizontal + } + + public CropContainer(ISurface parent) : base(parent) { Init(); } @@ -45,12 +73,65 @@ namespace Greenshot.Editor.Drawing private void Init() { - CreateDefaultAdorners(); + switch (GetFieldValue(FieldType.CROPMODE)) + { + case CropModes.Horizontal: + { + InitHorizontalCropOutStyle(); + break; + } + case CropModes.Vertical: + { + InitVerticalCropOutStyle(); + break; + } + default: + { + CreateDefaultAdorners(); + break; + } + } + } + + private void InitHorizontalCropOutStyle() + { + const int defaultHeight = 25; + + if (_parent?.Image is { } image) + { + Size = new Size(image.Width, defaultHeight); + } + CreateTopBottomAdorners(); + } + + private void InitVerticalCropOutStyle() + { + const int defaultWidth = 25; + + if (_parent?.Image is { } image) + { + Size = new Size(defaultWidth, image.Height); + } + + CreateLeftRightAdorners(); + } + + private void CreateTopBottomAdorners() + { + Adorners.Add(new ResizeAdorner(this, Positions.TopCenter)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomCenter)); + } + + private void CreateLeftRightAdorners() + { + Adorners.Add(new ResizeAdorner(this, Positions.MiddleLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.MiddleRight)); } protected override void InitializeFields() { AddField(GetType(), FieldType.FLAGS, FieldFlag.CONFIRMABLE); + AddField(GetType(), FieldType.CROPMODE, CropModes.Default); } public override void Invalidate() @@ -62,16 +143,16 @@ namespace Greenshot.Editor.Drawing /// We need to override the DrawingBound, return a rectangle in the size of the image, to make sure this element is always draw /// (we create a transparent brown over the complete picture) /// - public override Rectangle DrawingBounds + public override NativeRect DrawingBounds { get { if (_parent?.Image is { } image) { - return new Rectangle(0, 0, image.Width, image.Height); + return new NativeRect(0, 0, image.Width, image.Height); } - return Rectangle.Empty; + return NativeRect.Empty; } } @@ -82,27 +163,114 @@ namespace Greenshot.Editor.Drawing return; } + using Brush cropBrush = new SolidBrush(Color.FromArgb(100, 150, 150, 100)); - Rectangle cropRectangle = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - Rectangle selectionRect = new Rectangle(cropRectangle.Left - 1, cropRectangle.Top - 1, cropRectangle.Width + 1, cropRectangle.Height + 1); + var cropRectangle = new NativeRect(Left, Top, Width, Height).Normalize(); + var selectionRect = new NativeRect(cropRectangle.Left - 1, cropRectangle.Top - 1, cropRectangle.Width + 1, cropRectangle.Height + 1); Size imageSize = _parent.Image.Size; DrawSelectionBorder(g, selectionRect); - // top - g.FillRectangle(cropBrush, new Rectangle(0, 0, imageSize.Width, cropRectangle.Top)); - // left - g.FillRectangle(cropBrush, new Rectangle(0, cropRectangle.Top, cropRectangle.Left, cropRectangle.Height)); - // right - g.FillRectangle(cropBrush, - new Rectangle(cropRectangle.Left + cropRectangle.Width, cropRectangle.Top, imageSize.Width - (cropRectangle.Left + cropRectangle.Width), cropRectangle.Height)); - // bottom - g.FillRectangle(cropBrush, new Rectangle(0, cropRectangle.Top + cropRectangle.Height, imageSize.Width, imageSize.Height - (cropRectangle.Top + cropRectangle.Height))); + switch (GetFieldValue(FieldType.CROPMODE)) + { + case CropModes.Horizontal: + case CropModes.Vertical: + { + //draw inside + g.FillRectangle(cropBrush, cropRectangle); + break; + } + default: + { + //draw outside + // top + g.FillRectangle(cropBrush, new Rectangle(0, 0, imageSize.Width, cropRectangle.Top)); + // left + g.FillRectangle(cropBrush, new Rectangle(0, cropRectangle.Top, cropRectangle.Left, cropRectangle.Height)); + // right + g.FillRectangle(cropBrush, new Rectangle(cropRectangle.Left + cropRectangle.Width, cropRectangle.Top, imageSize.Width - (cropRectangle.Left + cropRectangle.Width), cropRectangle.Height)); + // bottom + g.FillRectangle(cropBrush, new Rectangle(0, cropRectangle.Top + cropRectangle.Height, imageSize.Width, imageSize.Height - (cropRectangle.Top + cropRectangle.Height))); + break; + } + } + + } /// /// No context menu for the CropContainer /// public override bool HasContextMenu => false; + + public override bool HandleMouseDown(int x, int y) + { + return GetFieldValue(FieldType.CROPMODE) switch + { + //force horizontal crop to left edge + CropModes.Horizontal => base.HandleMouseDown(0, y), + //force vertical crop to top edge + CropModes.Vertical => base.HandleMouseDown(x, 0), + _ => base.HandleMouseDown(x, y), + }; + } + + public override bool HandleMouseMove(int x, int y) + { + Invalidate(); + + switch (GetFieldValue(FieldType.CROPMODE)) + { + case CropModes.Horizontal: + { + //stick on left and right + //allow only horizontal changes + if (_parent?.Image is { } image) + { + _boundsAfterResize = new NativeRectFloat(0, _boundsBeforeResize.Top, image.Width, y - _boundsAfterResize.Top); + } + break; + } + case CropModes.Vertical: + { + //stick on top and bottom + //allow only vertical changes + if (_parent?.Image is { } image) + { + _boundsAfterResize = new NativeRectFloat(_boundsBeforeResize.Left, 0, x - _boundsAfterResize.Left, image.Height); + } + break; + } + default: + { + // reset "workbench" rectangle to current bounds + _boundsAfterResize = new NativeRectFloat( + _boundsBeforeResize.Left, _boundsBeforeResize.Top, + x - _boundsAfterResize.Left, y - _boundsAfterResize.Top); + + _boundsAfterResize = ScaleHelper.Scale(_boundsAfterResize, x, y, GetAngleRoundProcessor()); + break; + } + } + + // apply scaled bounds to this DrawableContainer + ApplyBounds(_boundsAfterResize); + + Invalidate(); + return true; + } + /// + /// + /// + /// Make sure this container is not undoable + /// + public override bool IsUndoable => false; + + /// + /// + /// + /// See dedicated confirm method + /// + public override bool IsConfirmable => true; } -} \ No newline at end of file +} diff --git a/src/Greenshot.Editor/Drawing/CursorContainer.cs b/src/Greenshot.Editor/Drawing/CursorContainer.cs index d2e19adba..e8914eb75 100644 --- a/src/Greenshot.Editor/Drawing/CursorContainer.cs +++ b/src/Greenshot.Editor/Drawing/CursorContainer.cs @@ -25,6 +25,8 @@ using System.Drawing.Drawing2D; using System.IO; using System.Runtime.Serialization; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using log4net; @@ -40,7 +42,7 @@ namespace Greenshot.Editor.Drawing protected Cursor cursor; - public CursorContainer(Surface parent) : base(parent) + public CursorContainer(ISurface parent) : base(parent) { Init(); } @@ -56,7 +58,7 @@ namespace Greenshot.Editor.Drawing CreateDefaultAdorners(); } - public CursorContainer(Surface parent, string filename) : this(parent) + public CursorContainer(ISurface parent, string filename) : this(parent) { Load(filename); } @@ -123,6 +125,6 @@ namespace Greenshot.Editor.Drawing cursor.DrawStretched(graphics, Bounds); } - public override Size DefaultSize => cursor?.Size ?? new Size(16, 16); + public override NativeSize DefaultSize => cursor?.Size ?? new NativeSize(16, 16); } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/DrawableContainer.cs b/src/Greenshot.Editor/Drawing/DrawableContainer.cs index b7202b23e..cac23dc3a 100644 --- a/src/Greenshot.Editor/Drawing/DrawableContainer.cs +++ b/src/Greenshot.Editor/Drawing/DrawableContainer.cs @@ -26,6 +26,9 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Runtime.Serialization; +using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; @@ -126,12 +129,17 @@ namespace Greenshot.Editor.Drawing } } - [NonSerialized] internal Surface _parent; + [NonSerialized] internal ISurface _parent; public ISurface Parent { get => _parent; - set => SwitchParent((Surface) value); + set => SwitchParent(value); + } + + protected Surface InternalParent + { + get => (Surface)_parent; } [NonSerialized] private TargetAdorner _targetAdorner; @@ -222,9 +230,9 @@ namespace Greenshot.Editor.Drawing } } - public Point Location + public NativePoint Location { - get => new Point(left, top); + get => new NativePoint(left, top); set { left = value.X; @@ -232,9 +240,9 @@ namespace Greenshot.Editor.Drawing } } - public Size Size + public NativeSize Size { - get => new Size(width, height); + get => new NativeSize(width, height); set { width = value.Width; @@ -251,15 +259,15 @@ namespace Greenshot.Editor.Drawing [NonSerialized] // will store current bounds of this DrawableContainer before starting a resize - protected Rectangle _boundsBeforeResize = Rectangle.Empty; + protected NativeRect _boundsBeforeResize = NativeRect.Empty; [NonSerialized] // "workbench" rectangle - used for calculating bounds during resizing (to be applied to this DrawableContainer afterwards) - protected RectangleF _boundsAfterResize = RectangleF.Empty; + protected NativeRectFloat _boundsAfterResize = NativeRectFloat.Empty; - public Rectangle Bounds + public NativeRect Bounds { - get => GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + get => new NativeRect(Left, Top, Width, Height).Normalize(); set { Left = Round(value.Left); @@ -269,7 +277,7 @@ namespace Greenshot.Editor.Drawing } } - public virtual void ApplyBounds(RectangleF newBounds) + public virtual void ApplyBounds(NativeRectFloat newBounds) { Left = Round(newBounds.Left); Top = Round(newBounds.Top); @@ -277,7 +285,7 @@ namespace Greenshot.Editor.Drawing Height = Round(newBounds.Height); } - public DrawableContainer(Surface parent) + public DrawableContainer(ISurface parent) { InitializeFields(); _parent = parent; @@ -302,7 +310,7 @@ namespace Greenshot.Editor.Drawing private bool accountForShadowChange; - public virtual Rectangle DrawingBounds + public virtual NativeRect DrawingBounds { get { @@ -310,7 +318,7 @@ namespace Greenshot.Editor.Drawing { if (filter.Invert) { - return new Rectangle(Point.Empty, _parent.Image.Size); + return new NativeRect(Point.Empty, _parent.Image.Size); } } @@ -334,7 +342,7 @@ namespace Greenshot.Editor.Drawing shadow += 10; } - return new Rectangle(Bounds.Left - offset, Bounds.Top - offset, Bounds.Width + lineThickness + shadow, Bounds.Height + lineThickness + shadow); + return new NativeRect(Bounds.Left - offset, Bounds.Top - offset, Bounds.Width + lineThickness + shadow, Bounds.Height + lineThickness + shadow); } } @@ -358,7 +366,8 @@ namespace Greenshot.Editor.Drawing /// /// Initialize a target gripper /// - protected void InitAdorner(Color gripperColor, Point location) + /// NativePoint + protected void InitTargetAdorner(NativePoint location) { _targetAdorner = new TargetAdorner(this, location); Adorners.Add(_targetAdorner); @@ -385,11 +394,11 @@ namespace Greenshot.Editor.Drawing Adorners.Add(new ResizeAdorner(this, Positions.MiddleRight)); } - public bool hasFilters => Filters.Count > 0; + public bool HasFilters => Filters.Count > 0; public abstract void Draw(Graphics graphics, RenderMode renderMode); - public virtual void DrawContent(Graphics graphics, Bitmap bmp, RenderMode renderMode, Rectangle clipRectangle) + public virtual void DrawContent(Graphics graphics, Bitmap bmp, RenderMode renderMode, NativeRect clipRectangle) { if (Children.Count > 0) { @@ -409,8 +418,7 @@ namespace Greenshot.Editor.Drawing } else { - Rectangle drawingRect = new Rectangle(Bounds.Location, Bounds.Size); - drawingRect.Intersect(clipRectangle); + var drawingRect = new NativeRect(Bounds.Location, Bounds.Size).Intersect(clipRectangle); if (filter is MagnifierFilter) { // quick&dirty bugfix, because MagnifierFilter behaves differently when drawn only partially @@ -434,7 +442,7 @@ namespace Greenshot.Editor.Drawing /// Adjust UI elements to the supplied DPI settings /// /// uint with dpi value - public void AdjustToDpi(uint dpi) + public void AdjustToDpi(int dpi) { foreach (var adorner in Adorners) { @@ -442,6 +450,12 @@ namespace Greenshot.Editor.Drawing } } + /// + public virtual void AddContextMenuItems(ContextMenuStrip menu, ISurface surface, MouseEventArgs mouseEventArgs) + { + // Empty as we do not want to add something to the context menu for every element + } + public virtual bool Contains(int x, int y) { return Bounds.Contains(x, y); @@ -449,12 +463,12 @@ namespace Greenshot.Editor.Drawing public virtual bool ClickableAt(int x, int y) { - Rectangle r = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - r.Inflate(5, 5); + var r = new NativeRect(Left, Top, Width, Height).Normalize(); + r = r.Inflate(5, 5); return r.Contains(x, y); } - protected void DrawSelectionBorder(Graphics g, Rectangle rect) + protected void DrawSelectionBorder(Graphics g, NativeRect rect) { using Pen pen = new Pen(Color.MediumSeaGreen) { @@ -467,20 +481,23 @@ namespace Greenshot.Editor.Drawing g.DrawRectangle(pen, rect); } + /// + public virtual bool IsUndoable => true; - public void ResizeTo(int width, int height, int anchorPosition) - { - Width = width; - Height = height; - } + /// + public virtual bool IsConfirmable => false; /// - /// Make a following bounds change on this drawablecontainer undoable! + /// Make a following bounds change on this DrawableContainer undoable! /// /// true means allow the moves to be merged - public void MakeBoundsChangeUndoable(bool allowMerge) + public virtual void MakeBoundsChangeUndoable(bool allowMerge) { - _parent.MakeUndoable(new DrawableContainerBoundsChangeMemento(this), allowMerge); + if (!IsUndoable) + { + return; + } + _parent?.MakeUndoable(new DrawableContainerBoundsChangeMemento(this), allowMerge); } public void MoveBy(int dx, int dy) @@ -497,8 +514,9 @@ namespace Greenshot.Editor.Drawing /// true if the event is handled, false if the surface needs to handle it public virtual bool HandleMouseDown(int x, int y) { - Left = _boundsBeforeResize.X = x; - Top = _boundsBeforeResize.Y = y; + _boundsBeforeResize = Bounds.MoveTo(x, y); + Left = x; + Top = y; return true; } @@ -512,13 +530,11 @@ namespace Greenshot.Editor.Drawing { Invalidate(); - // reset "workrbench" rectangle to current bounds - _boundsAfterResize.X = _boundsBeforeResize.Left; - _boundsAfterResize.Y = _boundsBeforeResize.Top; - _boundsAfterResize.Width = x - _boundsAfterResize.Left; - _boundsAfterResize.Height = y - _boundsAfterResize.Top; + // reset "workbench" rectangle to current bounds + _boundsAfterResize = new NativeRectFloat(_boundsBeforeResize.Left, _boundsBeforeResize.Top, x - _boundsAfterResize.Left, y - _boundsAfterResize.Top); - ScaleHelper.Scale(_boundsBeforeResize, x, y, ref _boundsAfterResize, GetAngleRoundProcessor()); + var scaleOptions = (this as IHaveScaleOptions)?.GetScaleOptions(); + _boundsAfterResize = ScaleHelper.Scale(_boundsAfterResize, x, y, GetAngleRoundProcessor(), scaleOptions); // apply scaled bounds to this DrawableContainer ApplyBounds(_boundsAfterResize); @@ -536,7 +552,7 @@ namespace Greenshot.Editor.Drawing { } - protected virtual void SwitchParent(Surface newParent) + protected virtual void SwitchParent(ISurface newParent) { if (newParent == Parent) { @@ -554,11 +570,10 @@ namespace Greenshot.Editor.Drawing protected void OnPropertyChanged(string propertyName) { - if (_propertyChanged != null) - { - _propertyChanged(this, new PropertyChangedEventArgs(propertyName)); - Invalidate(); - } + if (_propertyChanged == null) return; + + _propertyChanged(this, new PropertyChangedEventArgs(propertyName)); + Invalidate(); } /// @@ -569,7 +584,10 @@ namespace Greenshot.Editor.Drawing /// The new value public virtual void BeforeFieldChange(IField fieldToBeChanged, object newValue) { - _parent?.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); + if (IsUndoable) + { + _parent?.MakeUndoable(new ChangeFieldHolderMemento(this, fieldToBeChanged), true); + } Invalidate(); } @@ -649,16 +667,16 @@ namespace Greenshot.Editor.Drawing Height = points[1].Y - points[0].Y; } - protected virtual ScaleHelper.IDoubleProcessor GetAngleRoundProcessor() + protected virtual IDoubleProcessor GetAngleRoundProcessor() { - return ScaleHelper.ShapeAngleRoundBehavior.Instance; + return ShapeAngleRoundBehavior.INSTANCE; } public virtual bool HasContextMenu => true; public virtual bool HasDefaultSize => false; - public virtual Size DefaultSize => throw new NotSupportedException("Object doesn't have a default size"); + public virtual NativeSize DefaultSize => throw new NotSupportedException("Object doesn't have a default size"); /// /// Allows to override the initializing of the fields, so we can actually have our own defaults diff --git a/src/Greenshot.Editor/Drawing/DrawableContainerList.cs b/src/Greenshot.Editor/Drawing/DrawableContainerList.cs index a7ed4f75b..ef30c037f 100644 --- a/src/Greenshot.Editor/Drawing/DrawableContainerList.cs +++ b/src/Greenshot.Editor/Drawing/DrawableContainerList.cs @@ -24,8 +24,11 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; +using System.Linq; using System.Threading; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; @@ -42,7 +45,7 @@ namespace Greenshot.Editor.Drawing [Serializable] public class DrawableContainerList : List, IDrawableContainerList { - private static readonly ComponentResourceManager EditorFormResources = new ComponentResourceManager(typeof(ImageEditorForm)); + private static readonly ComponentResourceManager EditorFormResources = new(typeof(ImageEditorForm)); public Guid ParentID { get; private set; } @@ -50,6 +53,11 @@ namespace Greenshot.Editor.Drawing { } + public DrawableContainerList(IEnumerable elements) + { + AddRange(elements); + } + public DrawableContainerList(Guid parentId) { ParentID = parentId; @@ -130,17 +138,21 @@ namespace Greenshot.Editor.Drawing } /// - /// Make a following bounds change on this containerlist undoable! + /// Make a following bounds change on this DrawableContainerList undoable! /// /// true means allow the moves to be merged public void MakeBoundsChangeUndoable(bool allowMerge) { - if (Count > 0 && Parent != null) + if (Count <= 0 || Parent == null) return; + // Take all containers to make undoable + var containersToClone = this.Where(c => c.IsUndoable).ToList(); + if (!containersToClone.Any()) { - var clone = new DrawableContainerList(); - clone.AddRange(this); - Parent.MakeUndoable(new DrawableContainerBoundsChangeMemento(clone), allowMerge); + return; } + var clone = new DrawableContainerList(); + clone.AddRange(containersToClone); + Parent.MakeUndoable(new DrawableContainerBoundsChangeMemento(clone), allowMerge); } /// @@ -248,11 +260,11 @@ namespace Greenshot.Editor.Drawing /// /// /// true if an filter intersects - public bool HasIntersectingFilters(Rectangle clipRectangle) + public bool HasIntersectingFilters(NativeRect clipRectangle) { foreach (var dc in this) { - if (dc.DrawingBounds.IntersectsWith(clipRectangle) && dc.hasFilters && dc.Status == EditStatus.IDLE) + if (dc.DrawingBounds.IntersectsWith(clipRectangle) && dc.HasFilters && dc.Status == EditStatus.IDLE) { return true; } @@ -264,9 +276,9 @@ namespace Greenshot.Editor.Drawing /// /// Check if any of the drawableContainers are inside the rectangle /// - /// + /// NativeRect /// - public bool IntersectsWith(Rectangle clipRectangle) + public bool IntersectsWith(NativeRect clipRectangle) { foreach (var dc in this) { @@ -283,24 +295,22 @@ namespace Greenshot.Editor.Drawing /// A rectangle containing DrawingBounds of all drawableContainers in this list, /// or empty rectangle if nothing is there. /// - public Rectangle DrawingBounds + public NativeRect DrawingBounds { get { if (Count == 0) { - return Rectangle.Empty; + return NativeRect.Empty; } - else - { - var result = this[0].DrawingBounds; - for (int i = 1; i < Count; i++) - { - result = Rectangle.Union(result, this[i].DrawingBounds); - } - return result; + var result = this[0].DrawingBounds; + for (int i = 1; i < Count; i++) + { + result = result.Union(this[i].DrawingBounds); } + + return result; } } @@ -309,9 +319,9 @@ namespace Greenshot.Editor.Drawing /// /// the to the bitmap related Graphics object /// Bitmap to draw - /// the rendermode in which the element is to be drawn - /// - public void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, Rectangle clipRectangle) + /// the RenderMode in which the element is to be drawn + /// NativeRect + public void Draw(Graphics g, Bitmap bitmap, RenderMode renderMode, NativeRect clipRectangle) { if (Parent == null) { @@ -357,10 +367,10 @@ namespace Greenshot.Editor.Drawing return; } - Rectangle region = Rectangle.Empty; + NativeRect region = NativeRect.Empty; foreach (var dc in this) { - region = Rectangle.Union(region, dc.DrawingBounds); + region = region.Union(dc.DrawingBounds); } Parent.InvalidateElements(region); @@ -574,18 +584,17 @@ namespace Greenshot.Editor.Drawing return; } - var dc = this[index1]; - this[index1] = this[index2]; - this[index2] = dc; + (this[index1], this[index2]) = (this[index2], this[index1]); Parent.Modified = true; } /// /// Add items to a context menu for the selected item /// - /// - /// - public virtual void AddContextMenuItems(ContextMenuStrip menu, ISurface surface) + /// ContextMenuStrip + /// ISurface + /// MouseEventArgs + public virtual void AddContextMenuItems(ContextMenuStrip menu, ISurface surface, MouseEventArgs mouseEventArgs) { bool push = surface.Elements.CanPushDown(this); bool pull = surface.Elements.CanPullUp(this); @@ -672,15 +681,7 @@ namespace Greenshot.Editor.Drawing menu.Items.Add(item); // Reset - bool canReset = false; - foreach (var drawableContainer in this) - { - var container = (DrawableContainer) drawableContainer; - if (container.HasDefaultSize) - { - canReset = true; - } - } + bool canReset = this.Cast().Any(container => container.HasDefaultSize); if (canReset) { @@ -707,48 +708,40 @@ namespace Greenshot.Editor.Drawing }; menu.Items.Add(item); } + + // "ask" the containers to add to the context menu + foreach (var surfaceElement in surface.Elements) + { + surfaceElement.AddContextMenuItems(menu, surface, mouseEventArgs); + } } - public virtual void ShowContextMenu(MouseEventArgs e, ISurface iSurface) + public virtual void ShowContextMenu(MouseEventArgs mouseEventArgs, ISurface iSurface) { - if (!(iSurface is Surface surface)) + if (iSurface is not Surface surface) { return; } - bool hasMenu = false; - foreach (var drawableContainer in this) + bool hasMenu = this.Cast().Any(container => container.HasContextMenu); + + if (!hasMenu) return; + + ContextMenuStrip menu = new ContextMenuStrip(); + AddContextMenuItems(menu, surface, mouseEventArgs); + if (menu.Items.Count <= 0) return; + menu.Show(surface, surface.ToSurfaceCoordinates(mouseEventArgs.Location)); + while (true) { - var container = (DrawableContainer) drawableContainer; - if (!container.HasContextMenu) + if (menu.Visible) { - continue; + Application.DoEvents(); + Thread.Sleep(100); } - - hasMenu = true; - break; - } - - if (hasMenu) - { - ContextMenuStrip menu = new ContextMenuStrip(); - AddContextMenuItems(menu, surface); - if (menu.Items.Count > 0) + else { - menu.Show(surface, surface.ToSurfaceCoordinates(e.Location)); - while (true) - { - if (menu.Visible) - { - Application.DoEvents(); - Thread.Sleep(100); - } - else - { - menu.Dispose(); - break; - } - } + menu.Dispose(); + break; } } } @@ -757,18 +750,16 @@ namespace Greenshot.Editor.Drawing protected virtual void Dispose(bool disposing) { - if (!_disposedValue) + if (_disposedValue) return; + if (disposing) { - if (disposing) + foreach (var drawableContainer in this) { - foreach (var drawableContainer in this) - { - drawableContainer.Dispose(); - } + drawableContainer.Dispose(); } - - _disposedValue = true; } + + _disposedValue = true; } // This code added to correctly implement the disposable pattern. @@ -781,8 +772,8 @@ namespace Greenshot.Editor.Drawing /// /// Adjust UI elements to the supplied DPI settings /// - /// - public void AdjustToDpi(uint dpi) + /// int + public void AdjustToDpi(int dpi) { foreach (var drawableContainer in this) { diff --git a/src/Greenshot.Editor/Drawing/EllipseContainer.cs b/src/Greenshot.Editor/Drawing/EllipseContainer.cs index f7799ac71..c421515d9 100644 --- a/src/Greenshot.Editor/Drawing/EllipseContainer.cs +++ b/src/Greenshot.Editor/Drawing/EllipseContainer.cs @@ -23,6 +23,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Helpers; @@ -35,7 +38,7 @@ namespace Greenshot.Editor.Drawing [Serializable()] public class EllipseContainer : DrawableContainer { - public EllipseContainer(Surface parent) : base(parent) + public EllipseContainer(ISurface parent) : base(parent) { Init(); } @@ -70,7 +73,7 @@ namespace Greenshot.Editor.Drawing Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); DrawEllipse(rect, graphics, renderMode, lineThickness, lineColor, fillColor, shadow); } @@ -84,7 +87,7 @@ namespace Greenshot.Editor.Drawing /// /// /// - public static void DrawEllipse(Rectangle rect, Graphics graphics, RenderMode renderMode, int lineThickness, Color lineColor, Color fillColor, bool shadow) + public static void DrawEllipse(NativeRect rect, Graphics graphics, RenderMode renderMode, int lineThickness, Color lineColor, Color fillColor, bool shadow) { bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); // draw shadow before anything else @@ -100,7 +103,7 @@ namespace Greenshot.Editor.Drawing { Width = lineVisible ? lineThickness : 1 }; - Rectangle shadowRect = GuiRectangle.GetGuiRectangle(rect.Left + currentStep, rect.Top + currentStep, rect.Width, rect.Height); + var shadowRect = new NativeRect(rect.Left + currentStep, rect.Top + currentStep, rect.Width, rect.Height).Normalize(); graphics.DrawEllipse(shadowPen, shadowRect); currentStep++; alpha -= basealpha / steps; @@ -145,11 +148,11 @@ namespace Greenshot.Editor.Drawing { int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS) + 10; Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); return EllipseClickableAt(rect, lineThickness, fillColor, x, y); } - public static bool EllipseClickableAt(Rectangle rect, int lineThickness, Color fillColor, int x, int y) + public static bool EllipseClickableAt(NativeRect rect, int lineThickness, Color fillColor, int x, int y) { // If we clicked inside the rectangle and it's visible we are clickable at. if (!Color.Transparent.Equals(fillColor)) diff --git a/src/Greenshot.Editor/Drawing/Fields/FieldAggregator.cs b/src/Greenshot.Editor/Drawing/Fields/FieldAggregator.cs index 2df16d46f..96a19b7b9 100644 --- a/src/Greenshot.Editor/Drawing/Fields/FieldAggregator.cs +++ b/src/Greenshot.Editor/Drawing/Fields/FieldAggregator.cs @@ -42,7 +42,7 @@ namespace Greenshot.Editor.Drawing.Fields /// If the property values of the selected elements differ, the value of the last bound element wins. /// [Serializable] - public sealed class FieldAggregator : AbstractFieldHolder + public sealed class FieldAggregator : AbstractFieldHolder, IFieldAggregator { private readonly IDrawableContainerList _boundContainers; private bool _internalUpdateRunning; @@ -117,11 +117,10 @@ namespace Greenshot.Editor.Drawing.Fields public void UnbindElement(IDrawableContainer dc) { - if (_boundContainers.Contains(dc)) - { - _boundContainers.Remove(dc); - UpdateFromBoundElements(); - } + if (!_boundContainers.Contains(dc)) return; + + _boundContainers.Remove(dc); + UpdateFromBoundElements(); } public void Clear() diff --git a/src/Greenshot.Editor/Drawing/Fields/FieldType.cs b/src/Greenshot.Editor/Drawing/Fields/FieldType.cs index c3b732f4b..eead7452a 100644 --- a/src/Greenshot.Editor/Drawing/Fields/FieldType.cs +++ b/src/Greenshot.Editor/Drawing/Fields/FieldType.cs @@ -31,31 +31,33 @@ namespace Greenshot.Editor.Drawing.Fields [Serializable] public class FieldType : IFieldType { - public static readonly IFieldType ARROWHEADS = new FieldType("ARROWHEADS"); - public static readonly IFieldType BLUR_RADIUS = new FieldType("BLUR_RADIUS"); - public static readonly IFieldType BRIGHTNESS = new FieldType("BRIGHTNESS"); - public static readonly IFieldType FILL_COLOR = new FieldType("FILL_COLOR"); - public static readonly IFieldType FONT_BOLD = new FieldType("FONT_BOLD"); - public static readonly IFieldType FONT_FAMILY = new FieldType("FONT_FAMILY"); - public static readonly IFieldType FONT_ITALIC = new FieldType("FONT_ITALIC"); - public static readonly IFieldType FONT_SIZE = new FieldType("FONT_SIZE"); - public static readonly IFieldType TEXT_HORIZONTAL_ALIGNMENT = new FieldType("TEXT_HORIZONTAL_ALIGNMENT"); - public static readonly IFieldType TEXT_VERTICAL_ALIGNMENT = new FieldType("TEXT_VERTICAL_ALIGNMENT"); - public static readonly IFieldType HIGHLIGHT_COLOR = new FieldType("HIGHLIGHT_COLOR"); - public static readonly IFieldType LINE_COLOR = new FieldType("LINE_COLOR"); - public static readonly IFieldType LINE_THICKNESS = new FieldType("LINE_THICKNESS"); - public static readonly IFieldType MAGNIFICATION_FACTOR = new FieldType("MAGNIFICATION_FACTOR"); - public static readonly IFieldType PIXEL_SIZE = new FieldType("PIXEL_SIZE"); - public static readonly IFieldType PREVIEW_QUALITY = new FieldType("PREVIEW_QUALITY"); - public static readonly IFieldType SHADOW = new FieldType("SHADOW"); - public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType("PREPARED_FILTER_OBFUSCATE"); - public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType("PREPARED_FILTER_HIGHLIGHT"); - public static readonly IFieldType FLAGS = new FieldType("FLAGS"); + public static readonly IFieldType ARROWHEADS = new FieldType(nameof(ARROWHEADS)); + public static readonly IFieldType BLUR_RADIUS = new FieldType(nameof(BLUR_RADIUS)); + public static readonly IFieldType BRIGHTNESS = new FieldType(nameof(BRIGHTNESS)); + public static readonly IFieldType FILL_COLOR = new FieldType(nameof(FILL_COLOR)); + public static readonly IFieldType FONT_BOLD = new FieldType(nameof(FONT_BOLD)); + public static readonly IFieldType FONT_FAMILY = new FieldType(nameof(FONT_FAMILY)); + public static readonly IFieldType FONT_ITALIC = new FieldType(nameof(FONT_ITALIC)); + public static readonly IFieldType FONT_SIZE = new FieldType(nameof(FONT_SIZE)); + public static readonly IFieldType TEXT_HORIZONTAL_ALIGNMENT = new FieldType(nameof(TEXT_HORIZONTAL_ALIGNMENT)); + public static readonly IFieldType TEXT_VERTICAL_ALIGNMENT = new FieldType(nameof(TEXT_VERTICAL_ALIGNMENT)); + public static readonly IFieldType HIGHLIGHT_COLOR = new FieldType(nameof(HIGHLIGHT_COLOR)); + public static readonly IFieldType LINE_COLOR = new FieldType(nameof(LINE_COLOR)); + public static readonly IFieldType LINE_THICKNESS = new FieldType(nameof(LINE_THICKNESS)); + public static readonly IFieldType MAGNIFICATION_FACTOR = new FieldType(nameof(MAGNIFICATION_FACTOR)); + public static readonly IFieldType PIXEL_SIZE = new FieldType(nameof(PIXEL_SIZE)); + public static readonly IFieldType PREVIEW_QUALITY = new FieldType(nameof(PREVIEW_QUALITY)); + public static readonly IFieldType SHADOW = new FieldType(nameof(SHADOW)); + public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType(nameof(PREPARED_FILTER_OBFUSCATE)); + public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType(nameof(PREPARED_FILTER_HIGHLIGHT)); + public static readonly IFieldType FLAGS = new FieldType(nameof(FLAGS)); + public static readonly IFieldType CROPMODE = new FieldType(nameof(CROPMODE)); + public static IFieldType[] Values = { ARROWHEADS, BLUR_RADIUS, BRIGHTNESS, FILL_COLOR, FONT_BOLD, FONT_FAMILY, FONT_ITALIC, FONT_SIZE, TEXT_HORIZONTAL_ALIGNMENT, TEXT_VERTICAL_ALIGNMENT, HIGHLIGHT_COLOR, - LINE_COLOR, LINE_THICKNESS, MAGNIFICATION_FACTOR, PIXEL_SIZE, PREVIEW_QUALITY, SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, FLAGS + LINE_COLOR, LINE_THICKNESS, MAGNIFICATION_FACTOR, PIXEL_SIZE, PREVIEW_QUALITY, SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, FLAGS, CROPMODE }; public string Name { get; set; } diff --git a/src/Greenshot.Editor/Drawing/FilterContainer.cs b/src/Greenshot.Editor/Drawing/FilterContainer.cs index 3bdb5a5fd..4b846fe66 100644 --- a/src/Greenshot.Editor/Drawing/FilterContainer.cs +++ b/src/Greenshot.Editor/Drawing/FilterContainer.cs @@ -23,6 +23,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Helpers; @@ -51,7 +54,7 @@ namespace Greenshot.Editor.Drawing MAGNIFICATION }; - public FilterContainer(Surface parent) : base(parent) + public FilterContainer(ISurface parent) : base(parent) { Init(); } @@ -78,38 +81,37 @@ namespace Greenshot.Editor.Drawing { int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); - bool shadow = GetFieldValueAsBool(FieldType.SHADOW); bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); - if (lineVisible) - { - graphics.SmoothingMode = SmoothingMode.HighSpeed; - graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.None; - //draw shadow first - if (shadow) - { - int basealpha = 100; - int alpha = basealpha; - int steps = 5; - int currentStep = lineVisible ? 1 : 0; - while (currentStep <= steps) - { - using Pen shadowPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); - Rectangle shadowRect = GuiRectangle.GetGuiRectangle(Left + currentStep, Top + currentStep, Width, Height); - graphics.DrawRectangle(shadowPen, shadowRect); - currentStep++; - alpha -= basealpha / steps; - } - } + if (!lineVisible) return; + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - if (lineThickness > 0) + graphics.SmoothingMode = SmoothingMode.HighSpeed; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.None; + //draw shadow first + if (shadow) + { + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = lineVisible ? 1 : 0; + while (currentStep <= steps) { - using Pen pen = new Pen(lineColor, lineThickness); - graphics.DrawRectangle(pen, rect); + using Pen shadowPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); + var shadowRect = new NativeRect(Left + currentStep, Top + currentStep, Width, Height).Normalize(); + graphics.DrawRectangle(shadowPen, shadowRect); + currentStep++; + alpha -= basealpha / steps; } } + + if (lineThickness > 0) + { + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); + using Pen pen = new Pen(lineColor, lineThickness); + graphics.DrawRectangle(pen, rect); + } } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Filters/AbstractFilter.cs b/src/Greenshot.Editor/Drawing/Filters/AbstractFilter.cs index 17517b971..c972ed77d 100644 --- a/src/Greenshot.Editor/Drawing/Filters/AbstractFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/AbstractFilter.cs @@ -22,6 +22,7 @@ using System; using System.ComponentModel; using System.Drawing; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; @@ -73,7 +74,7 @@ namespace Greenshot.Editor.Drawing.Filters return parent; } - public abstract void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode); + public abstract void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode); protected void OnPropertyChanged(string propertyName) { diff --git a/src/Greenshot.Editor/Drawing/Filters/BlurFilter.cs b/src/Greenshot.Editor/Drawing/Filters/BlurFilter.cs index ac0e26a64..010cfd2cb 100644 --- a/src/Greenshot.Editor/Drawing/Filters/BlurFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/BlurFilter.cs @@ -22,9 +22,10 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Base.UnmanagedHelpers; using Greenshot.Editor.Drawing.Fields; namespace Greenshot.Editor.Drawing.Filters @@ -50,10 +51,10 @@ namespace Greenshot.Editor.Drawing.Filters AddField(GetType(), FieldType.PREVIEW_QUALITY, 1.0d); } - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { int blurRadius = GetFieldValueAsInt(FieldType.BLUR_RADIUS); - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + var applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { return; @@ -66,9 +67,9 @@ namespace Greenshot.Editor.Drawing.Filters graphics.ExcludeClip(rect); } - if (GDIplus.IsBlurPossible(blurRadius)) + if (GdiPlusApi.IsBlurPossible(blurRadius)) { - GDIplus.DrawWithBlur(graphics, applyBitmap, applyRect, null, null, blurRadius, false); + GdiPlusApi.DrawWithBlur(graphics, applyBitmap, applyRect, null, null, blurRadius, false); } else { diff --git a/src/Greenshot.Editor/Drawing/Filters/BrightnessFilter.cs b/src/Greenshot.Editor/Drawing/Filters/BrightnessFilter.cs index cfdf7b025..639b0e5ac 100644 --- a/src/Greenshot.Editor/Drawing/Filters/BrightnessFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/BrightnessFilter.cs @@ -23,6 +23,7 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; @@ -42,11 +43,11 @@ namespace Greenshot.Editor.Drawing.Filters /// /// /// - /// + /// NativeRect /// - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + var applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { diff --git a/src/Greenshot.Editor/Drawing/Filters/GrayscaleFilter.cs b/src/Greenshot.Editor/Drawing/Filters/GrayscaleFilter.cs index 5ed195fc7..441102980 100644 --- a/src/Greenshot.Editor/Drawing/Filters/GrayscaleFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/GrayscaleFilter.cs @@ -23,13 +23,14 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; namespace Greenshot.Editor.Drawing.Filters { /// - /// Description of GrayscaleFilter. + /// GrayscaleFilter makes the image grey /// [Serializable()] public class GrayscaleFilter : AbstractFilter @@ -38,9 +39,9 @@ namespace Greenshot.Editor.Drawing.Filters { } - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + var applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { diff --git a/src/Greenshot.Editor/Drawing/Filters/HighlightFilter.cs b/src/Greenshot.Editor/Drawing/Filters/HighlightFilter.cs index 32337fb98..24624d193 100644 --- a/src/Greenshot.Editor/Drawing/Filters/HighlightFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/HighlightFilter.cs @@ -22,12 +22,16 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; namespace Greenshot.Editor.Drawing.Filters { + /// + /// This filter highlights an area + /// [Serializable()] public class HighlightFilter : AbstractFilter { @@ -41,11 +45,11 @@ namespace Greenshot.Editor.Drawing.Filters /// /// /// - /// + /// NativeRect /// - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + var applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { diff --git a/src/Greenshot.Editor/Drawing/Filters/IFilter.cs b/src/Greenshot.Editor/Drawing/Filters/IFilter.cs index 144732761..8c6d3d21d 100644 --- a/src/Greenshot.Editor/Drawing/Filters/IFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/IFilter.cs @@ -21,6 +21,7 @@ using System.ComponentModel; using System.Drawing; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Interfaces.Drawing; namespace Greenshot.Editor.Drawing.Filters @@ -28,7 +29,7 @@ namespace Greenshot.Editor.Drawing.Filters public interface IFilter : INotifyPropertyChanged, IFieldHolder { DrawableContainer Parent { get; set; } - void Apply(Graphics graphics, Bitmap bmp, Rectangle rect, RenderMode renderMode); + void Apply(Graphics graphics, Bitmap bmp, NativeRect rect, RenderMode renderMode); DrawableContainer GetParent(); bool Invert { get; set; } } diff --git a/src/Greenshot.Editor/Drawing/Filters/MagnifierFilter.cs b/src/Greenshot.Editor/Drawing/Filters/MagnifierFilter.cs index f76640820..70d829a2e 100644 --- a/src/Greenshot.Editor/Drawing/Filters/MagnifierFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/MagnifierFilter.cs @@ -22,12 +22,16 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; namespace Greenshot.Editor.Drawing.Filters { + /// + /// Magnify an area + /// [Serializable] public class MagnifierFilter : AbstractFilter { @@ -36,9 +40,9 @@ namespace Greenshot.Editor.Drawing.Filters AddField(GetType(), FieldType.MAGNIFICATION_FACTOR, 2); } - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { - Rectangle applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); + var applyRect = ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); if (applyRect.Width == 0 || applyRect.Height == 0) { @@ -62,7 +66,7 @@ namespace Greenshot.Editor.Drawing.Filters int halfHeight = rect.Height / 2; int newWidth = rect.Width / magnificationFactor; int newHeight = rect.Height / magnificationFactor; - Rectangle source = new Rectangle(rect.X + halfWidth - newWidth / 2, rect.Y + halfHeight - newHeight / 2, newWidth, newHeight); + var source = new NativeRect(rect.X + halfWidth - newWidth / 2, rect.Y + halfHeight - newHeight / 2, newWidth, newHeight); graphics.DrawImage(applyBitmap, rect, source, GraphicsUnit.Pixel); graphics.Restore(state); } diff --git a/src/Greenshot.Editor/Drawing/Filters/PixelizationFilter.cs b/src/Greenshot.Editor/Drawing/Filters/PixelizationFilter.cs index d0b88d4f7..fa677b128 100644 --- a/src/Greenshot.Editor/Drawing/Filters/PixelizationFilter.cs +++ b/src/Greenshot.Editor/Drawing/Filters/PixelizationFilter.cs @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; @@ -29,6 +30,9 @@ using Greenshot.Editor.Helpers; namespace Greenshot.Editor.Drawing.Filters { + /// + /// Pixelate an area + /// [Serializable()] public class PixelizationFilter : AbstractFilter { @@ -37,7 +41,7 @@ namespace Greenshot.Editor.Drawing.Filters AddField(GetType(), FieldType.PIXEL_SIZE, 5); } - public override void Apply(Graphics graphics, Bitmap applyBitmap, Rectangle rect, RenderMode renderMode) + public override void Apply(Graphics graphics, Bitmap applyBitmap, NativeRect rect, RenderMode renderMode) { int pixelSize = GetFieldValueAsInt(FieldType.PIXEL_SIZE); ImageHelper.CreateIntersectRectangle(applyBitmap.Size, rect, Invert); diff --git a/src/Greenshot.Editor/Drawing/FreehandContainer.cs b/src/Greenshot.Editor/Drawing/FreehandContainer.cs index e37221551..9c66e1a8e 100644 --- a/src/Greenshot.Editor/Drawing/FreehandContainer.cs +++ b/src/Greenshot.Editor/Drawing/FreehandContainer.cs @@ -1,323 +1,325 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing.Fields; -using Greenshot.Editor.Helpers; - -namespace Greenshot.Editor.Drawing -{ - /// - /// Description of PathContainer. - /// - [Serializable] - public class FreehandContainer : DrawableContainer - { - private static readonly float[] PointOffset = - { - 0.5f, 0.25f, 0.75f - }; - - [NonSerialized] private GraphicsPath freehandPath = new GraphicsPath(); - private Rectangle myBounds = Rectangle.Empty; - private Point lastMouse = Point.Empty; - private readonly List capturePoints = new List(); - private bool isRecalculated; - - /// - /// Constructor - /// - public FreehandContainer(Surface parent) : base(parent) - { - Width = parent.Image.Width; - Height = parent.Image.Height; - Top = 0; - Left = 0; - } - - protected override void InitializeFields() - { - AddField(GetType(), FieldType.LINE_THICKNESS, 3); - AddField(GetType(), FieldType.LINE_COLOR, Color.Red); - } - - public override void Transform(Matrix matrix) - { - Point[] points = capturePoints.ToArray(); - - matrix.TransformPoints(points); - capturePoints.Clear(); - capturePoints.AddRange(points); - RecalculatePath(); - } - - protected override void OnDeserialized(StreamingContext context) - { - RecalculatePath(); - } - - /// - /// This Dispose is called from the Dispose and the Destructor. - /// - /// When disposing==true all non-managed resources should be freed too! - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - if (disposing) - { - freehandPath?.Dispose(); - } - - freehandPath = null; - } - - /// - /// Called from Surface (the parent) when the drawing begins (mouse-down) - /// - /// true if the surface doesn't need to handle the event - public override bool HandleMouseDown(int mouseX, int mouseY) - { - lastMouse = new Point(mouseX, mouseY); - capturePoints.Add(lastMouse); - return true; - } - - /// - /// Called from Surface (the parent) if a mouse move is made while drawing - /// - /// true if the surface doesn't need to handle the event - public override bool HandleMouseMove(int mouseX, int mouseY) - { - Point previousPoint = capturePoints[capturePoints.Count - 1]; - - if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= 2 * EditorConfig.FreehandSensitivity) - { - capturePoints.Add(new Point(mouseX, mouseY)); - } - - if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) < EditorConfig.FreehandSensitivity) - { - return true; - } - - //path.AddCurve(new Point[]{lastMouse, new Point(mouseX, mouseY)}); - lastMouse = new Point(mouseX, mouseY); - freehandPath.AddLine(lastMouse, new Point(mouseX, mouseY)); - // Only re-calculate the bounds & redraw when we added something to the path - myBounds = Rectangle.Round(freehandPath.GetBounds()); - - Invalidate(); - return true; - } - - /// - /// Called when the surface finishes drawing the element - /// - public override void HandleMouseUp(int mouseX, int mouseY) - { - // Make sure we don't loose the ending point - if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) >= EditorConfig.FreehandSensitivity) - { - capturePoints.Add(new Point(mouseX, mouseY)); - } - - RecalculatePath(); - } - - /// - /// Here we recalculate the freehand path by smoothing out the lines with Beziers. - /// - private void RecalculatePath() - { - // Store the previous path, to dispose it later when we are finished - var previousFreehandPath = freehandPath; - var newFreehandPath = new GraphicsPath(); - - // Here we can put some cleanup... like losing all the uninteresting points. - if (capturePoints.Count >= 3) - { - int index = 0; - while ((capturePoints.Count - 1) % 3 != 0) - { - // duplicate points, first at 50% than 25% than 75% - capturePoints.Insert((int) (capturePoints.Count * PointOffset[index]), capturePoints[(int) (capturePoints.Count * PointOffset[index++])]); - } - - newFreehandPath.AddBeziers(capturePoints.ToArray()); - } - else if (capturePoints.Count == 2) - { - newFreehandPath.AddLine(capturePoints[0], capturePoints[1]); - } - - // Recalculate the bounds - myBounds = Rectangle.Round(newFreehandPath.GetBounds()); - - // assign - isRecalculated = true; - freehandPath = newFreehandPath; - - // dispose previous - previousFreehandPath?.Dispose(); - } - - /// - /// Do the drawing of the freehand "stroke" - /// - /// - /// - public override void Draw(Graphics graphics, RenderMode renderMode) - { - graphics.SmoothingMode = SmoothingMode.HighQuality; - graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; - - int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); - Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); - using var pen = new Pen(lineColor) - { - Width = lineThickness - }; - if (!(pen.Width > 0)) - { - return; - } - - // Make sure the lines are nicely rounded - pen.EndCap = LineCap.Round; - pen.StartCap = LineCap.Round; - pen.LineJoin = LineJoin.Round; - // Move to where we need to draw - graphics.TranslateTransform(Left, Top); - var currentFreehandPath = freehandPath; - if (currentFreehandPath != null) - { - if (isRecalculated && Selected && renderMode == RenderMode.EDIT) - { - isRecalculated = false; - DrawSelectionBorder(graphics, pen, currentFreehandPath); - } - - graphics.DrawPath(pen, currentFreehandPath); - } - - // Move back, otherwise everything is shifted - graphics.TranslateTransform(-Left, -Top); - } - - /// - /// Draw a selectionborder around the freehand path - /// - /// Graphics - /// Pen - /// GraphicsPath - protected static void DrawSelectionBorder(Graphics graphics, Pen linePen, GraphicsPath path) - { - using var selectionPen = (Pen) linePen.Clone(); - using var selectionPath = (GraphicsPath) path.Clone(); - selectionPen.Width += 5; - selectionPen.Color = Color.FromArgb(120, Color.LightSeaGreen); - graphics.DrawPath(selectionPen, selectionPath); - selectionPath.Widen(selectionPen); - selectionPen.DashPattern = new float[] - { - 2, 2 - }; - selectionPen.Color = Color.LightSeaGreen; - selectionPen.Width = 1; - graphics.DrawPath(selectionPen, selectionPath); - } - - /// - /// Get the bounds in which we have something drawn, plus safety margin, these are not the normal bounds... - /// - public override Rectangle DrawingBounds - { - get - { - if (!myBounds.IsEmpty) - { - int lineThickness = Math.Max(10, GetFieldValueAsInt(FieldType.LINE_THICKNESS)); - int safetymargin = 10; - return new Rectangle(myBounds.Left + Left - (safetymargin + lineThickness), myBounds.Top + Top - (safetymargin + lineThickness), - myBounds.Width + 2 * (lineThickness + safetymargin), myBounds.Height + 2 * (lineThickness + safetymargin)); - } - - if (_parent?.Image is Image image) - { - return new Rectangle(0, 0, image.Width, image.Height); - } - else - { - return Rectangle.Empty; - } - } - } - - /// - /// FreehandContainer are regarded equal if they are of the same type and their paths are equal. - /// - /// object - /// bool - public override bool Equals(object obj) - { - bool ret = false; - if (obj == null || GetType() != obj.GetType()) - { - return false; - } - - if (obj is FreehandContainer other && Equals(freehandPath, other.freehandPath)) - { - ret = true; - } - - return ret; - } - - public override int GetHashCode() - { - return freehandPath?.GetHashCode() ?? 0; - } - - public override bool ClickableAt(int x, int y) - { - bool returnValue = base.ClickableAt(x, y); - if (returnValue) - { - int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); - using var pen = new Pen(Color.White) - { - Width = lineThickness + 10 - }; - returnValue = freehandPath.IsOutlineVisible(x - Left, y - Top, pen); - } - - return returnValue; - } - } +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.Serialization; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Editor.Drawing.Fields; +using Greenshot.Editor.Helpers; + +namespace Greenshot.Editor.Drawing +{ + /// + /// Description of PathContainer. + /// + [Serializable] + public class FreehandContainer : DrawableContainer + { + private static readonly float[] PointOffset = + { + 0.5f, 0.25f, 0.75f + }; + + [NonSerialized] + private GraphicsPath freehandPath = new GraphicsPath(); + + private Rectangle myBounds = NativeRect.Empty; + private Point lastMouse = NativePoint.Empty; + private List capturePoints = new List(); + private bool isRecalculated; + + /// + /// Constructor + /// + public FreehandContainer(ISurface parent) : base(parent) + { + Width = parent.Image.Width; + Height = parent.Image.Height; + Top = 0; + Left = 0; + } + + protected override void InitializeFields() + { + AddField(GetType(), FieldType.LINE_THICKNESS, 3); + AddField(GetType(), FieldType.LINE_COLOR, Color.Red); + } + + public override void Transform(Matrix matrix) + { + Point[] points = capturePoints.ToArray(); + + matrix.TransformPoints(points); + capturePoints.Clear(); + capturePoints.AddRange(points); + RecalculatePath(); + } + + protected override void OnDeserialized(StreamingContext context) + { + RecalculatePath(); + } + + /// + /// This Dispose is called from the Dispose and the Destructor. + /// + /// When disposing==true all non-managed resources should be freed too! + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (disposing) + { + freehandPath?.Dispose(); + } + + freehandPath = null; + } + + /// + /// Called from Surface (the parent) when the drawing begins (mouse-down) + /// + /// true if the surface doesn't need to handle the event + public override bool HandleMouseDown(int mouseX, int mouseY) + { + lastMouse = new Point(mouseX, mouseY); + capturePoints.Add(lastMouse); + return true; + } + + /// + /// Called from Surface (the parent) if a mouse move is made while drawing + /// + /// true if the surface doesn't need to handle the event + public override bool HandleMouseMove(int mouseX, int mouseY) + { + Point previousPoint = capturePoints[capturePoints.Count - 1]; + + if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= 2 * EditorConfig.FreehandSensitivity) + { + capturePoints.Add(new Point(mouseX, mouseY)); + } + + if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) < EditorConfig.FreehandSensitivity) + { + return true; + } + + //path.AddCurve(new Point[]{lastMouse, new Point(mouseX, mouseY)}); + lastMouse = new Point(mouseX, mouseY); + freehandPath.AddLine(lastMouse, new Point(mouseX, mouseY)); + // Only re-calculate the bounds & redraw when we added something to the path + myBounds = Rectangle.Round(freehandPath.GetBounds()); + + Invalidate(); + return true; + } + + /// + /// Called when the surface finishes drawing the element + /// + public override void HandleMouseUp(int mouseX, int mouseY) + { + // Make sure we don't loose the ending point + if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) >= EditorConfig.FreehandSensitivity) + { + capturePoints.Add(new Point(mouseX, mouseY)); + } + + RecalculatePath(); + } + + /// + /// Here we recalculate the freehand path by smoothing out the lines with Beziers. + /// + private void RecalculatePath() + { + // Store the previous path, to dispose it later when we are finished + var previousFreehandPath = freehandPath; + var newFreehandPath = new GraphicsPath(); + + // Here we can put some cleanup... like losing all the uninteresting points. + if (capturePoints.Count >= 3) + { + int index = 0; + while ((capturePoints.Count - 1) % 3 != 0) + { + // duplicate points, first at 50% than 25% than 75% + capturePoints.Insert((int) (capturePoints.Count * PointOffset[index]), capturePoints[(int) (capturePoints.Count * PointOffset[index++])]); + } + + newFreehandPath.AddBeziers(capturePoints.ToArray()); + } + else if (capturePoints.Count == 2) + { + newFreehandPath.AddLine(capturePoints[0], capturePoints[1]); + } + + // Recalculate the bounds + myBounds = Rectangle.Round(newFreehandPath.GetBounds()); + + // assign + isRecalculated = true; + freehandPath = newFreehandPath; + + // dispose previous + previousFreehandPath?.Dispose(); + } + + /// + /// Do the drawing of the freehand "stroke" + /// + /// + /// + public override void Draw(Graphics graphics, RenderMode renderMode) + { + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + using var pen = new Pen(lineColor) + { + Width = lineThickness + }; + if (!(pen.Width > 0)) + { + return; + } + + // Make sure the lines are nicely rounded + pen.EndCap = LineCap.Round; + pen.StartCap = LineCap.Round; + pen.LineJoin = LineJoin.Round; + // Move to where we need to draw + graphics.TranslateTransform(Left, Top); + var currentFreehandPath = freehandPath; + if (currentFreehandPath != null) + { + if (isRecalculated && Selected && renderMode == RenderMode.EDIT) + { + isRecalculated = false; + DrawSelectionBorder(graphics, pen, currentFreehandPath); + } + + graphics.DrawPath(pen, currentFreehandPath); + } + + // Move back, otherwise everything is shifted + graphics.TranslateTransform(-Left, -Top); + } + + /// + /// Draw a selectionborder around the freehand path + /// + /// Graphics + /// Pen + /// GraphicsPath + protected static void DrawSelectionBorder(Graphics graphics, Pen linePen, GraphicsPath path) + { + using var selectionPen = (Pen) linePen.Clone(); + using var selectionPath = (GraphicsPath) path.Clone(); + selectionPen.Width += 5; + selectionPen.Color = Color.FromArgb(120, Color.LightSeaGreen); + graphics.DrawPath(selectionPen, selectionPath); + selectionPath.Widen(selectionPen); + selectionPen.DashPattern = new float[] + { + 2, 2 + }; + selectionPen.Color = Color.LightSeaGreen; + selectionPen.Width = 1; + graphics.DrawPath(selectionPen, selectionPath); + } + + /// + /// Get the bounds in which we have something drawn, plus safety margin, these are not the normal bounds... + /// + public override NativeRect DrawingBounds + { + get + { + if (!myBounds.IsEmpty) + { + int lineThickness = Math.Max(10, GetFieldValueAsInt(FieldType.LINE_THICKNESS)); + int safetyMargin = 10; + return new NativeRect(myBounds.Left + Left - (safetyMargin + lineThickness), myBounds.Top + Top - (safetyMargin + lineThickness), + myBounds.Width + 2 * (lineThickness + safetyMargin), myBounds.Height + 2 * (lineThickness + safetyMargin)); + } + + if (_parent?.Image is Image image) + { + return new NativeRect(0, 0, image.Width, image.Height); + } + + return NativeRect.Empty; + } + } + + /// + /// FreehandContainer are regarded equal if they are of the same type and their paths are equal. + /// + /// object + /// bool + public override bool Equals(object obj) + { + bool ret = false; + if (obj == null || GetType() != obj.GetType()) + { + return false; + } + + if (obj is FreehandContainer other && Equals(freehandPath, other.freehandPath)) + { + ret = true; + } + + return ret; + } + + public override int GetHashCode() + { + return freehandPath?.GetHashCode() ?? 0; + } + + public override bool ClickableAt(int x, int y) + { + bool returnValue = base.ClickableAt(x, y); + if (returnValue) + { + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + using var pen = new Pen(Color.White) + { + Width = lineThickness + 10 + }; + returnValue = freehandPath.IsOutlineVisible(x - Left, y - Top, pen); + } + + return returnValue; + } + } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/HighlightContainer.cs b/src/Greenshot.Editor/Drawing/HighlightContainer.cs index 417725322..58cf792ba 100644 --- a/src/Greenshot.Editor/Drawing/HighlightContainer.cs +++ b/src/Greenshot.Editor/Drawing/HighlightContainer.cs @@ -21,6 +21,7 @@ using System; using System.Runtime.Serialization; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Drawing.Filters; @@ -33,7 +34,7 @@ namespace Greenshot.Editor.Drawing [Serializable] public class HighlightContainer : FilterContainer { - public HighlightContainer(Surface parent) : base(parent) + public HighlightContainer(ISurface parent) : base(parent) { Init(); } diff --git a/src/Greenshot.Editor/Drawing/IconContainer.cs b/src/Greenshot.Editor/Drawing/IconContainer.cs index e98b37f82..185c17cd2 100644 --- a/src/Greenshot.Editor/Drawing/IconContainer.cs +++ b/src/Greenshot.Editor/Drawing/IconContainer.cs @@ -24,6 +24,8 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using log4net; @@ -39,7 +41,7 @@ namespace Greenshot.Editor.Drawing protected Icon icon; - public IconContainer(Surface parent) : base(parent) + public IconContainer(ISurface parent) : base(parent) { Init(); } @@ -55,11 +57,16 @@ namespace Greenshot.Editor.Drawing CreateDefaultAdorners(); } - public IconContainer(Surface parent, string filename) : base(parent) + public IconContainer(ISurface parent, string filename) : base(parent) { Load(filename); } + public IconContainer(ISurface parent, Stream stream) : base(parent) + { + Load(stream); + } + public Icon Icon { set @@ -99,6 +106,18 @@ namespace Greenshot.Editor.Drawing Log.Debug("Loaded file: " + filename + " with resolution: " + Height + "," + Width); } + public void Load(Stream iconStream) + { + if (iconStream == null) + { + return; + } + + using Icon fileIcon = new Icon(iconStream); + Icon = fileIcon; + Log.Debug("Loaded stream: with resolution: " + Height + "," + Width); + } + public override void Draw(Graphics graphics, RenderMode rm) { if (icon == null) @@ -115,6 +134,6 @@ namespace Greenshot.Editor.Drawing public override bool HasDefaultSize => true; - public override Size DefaultSize => icon?.Size ?? new Size(16, 16); + public override NativeSize DefaultSize => icon?.Size ?? new NativeSize(16, 16); } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/ImageContainer.cs b/src/Greenshot.Editor/Drawing/ImageContainer.cs index a46b0dae5..21f8d2fa6 100644 --- a/src/Greenshot.Editor/Drawing/ImageContainer.cs +++ b/src/Greenshot.Editor/Drawing/ImageContainer.cs @@ -24,8 +24,10 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Effects; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using log4net; @@ -40,7 +42,7 @@ namespace Greenshot.Editor.Drawing { private static readonly ILog Log = LogManager.GetLogger(typeof(ImageContainer)); - private Image image; + private Image _image; /// /// This is the shadow version of the bitmap, rendered once to save performance @@ -52,14 +54,14 @@ namespace Greenshot.Editor.Drawing /// This is the offset for the shadow version of the bitmap /// Do not serialize, as the offset is recreated /// - [NonSerialized] private Point _shadowOffset = new Point(-1, -1); + [NonSerialized] private NativePoint _shadowOffset = new NativePoint(-1, -1); - public ImageContainer(Surface parent, string filename) : this(parent) + public ImageContainer(ISurface parent, string filename) : this(parent) { Load(filename); } - public ImageContainer(Surface parent) : base(parent) + public ImageContainer(ISurface parent) : base(parent) { FieldChanged += BitmapContainer_OnFieldChanged; Init(); @@ -107,8 +109,8 @@ namespace Greenshot.Editor.Drawing } else { - Width = image.Width; - Height = image.Height; + Width = _image.Width; + Height = _image.Height; if (_shadowBitmap != null) { Left += _shadowOffset.X; @@ -124,13 +126,13 @@ namespace Greenshot.Editor.Drawing // Remove all current bitmaps DisposeImage(); DisposeShadow(); - image = ImageHelper.Clone(value); + _image = ImageHelper.Clone(value); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); CheckShadow(shadow); if (!shadow) { - Width = image.Width; - Height = image.Height; + Width = _image.Width; + Height = _image.Height; } else { @@ -140,7 +142,7 @@ namespace Greenshot.Editor.Drawing Top -= _shadowOffset.Y; } } - get { return image; } + get { return _image; } } /// @@ -162,8 +164,8 @@ namespace Greenshot.Editor.Drawing private void DisposeImage() { - image?.Dispose(); - image = null; + _image?.Dispose(); + _image = null; } private void DisposeShadow() @@ -186,9 +188,9 @@ namespace Greenshot.Editor.Drawing Log.DebugFormat("Rotating element with {0} degrees.", rotateAngle); DisposeShadow(); using var tmpMatrix = new Matrix(); - using (image) + using (_image) { - image = ImageHelper.ApplyEffect(image, new RotateEffect(rotateAngle), tmpMatrix); + _image = ImageHelper.ApplyEffect(_image, new RotateEffect(rotateAngle), tmpMatrix); } } @@ -208,7 +210,8 @@ namespace Greenshot.Editor.Drawing // Always make sure ImageHelper.LoadBitmap results are disposed some time, // as we close the bitmap internally, we need to do it afterwards - using (var tmpImage = ImageHelper.LoadImage(filename)) + // TODO: Replace with some other code, like the file format handler, or move it completely outside of this class + using (var tmpImage = ImageIO.LoadImage(filename)) { Image = tmpImage; } @@ -228,7 +231,7 @@ namespace Greenshot.Editor.Drawing } using var matrix = new Matrix(); - _shadowBitmap = ImageHelper.ApplyEffect(image, new DropShadowEffect(), matrix); + _shadowBitmap = ImageHelper.ApplyEffect(_image, new DropShadowEffect(), matrix); } /// @@ -238,7 +241,7 @@ namespace Greenshot.Editor.Drawing /// public override void Draw(Graphics graphics, RenderMode rm) { - if (image == null) + if (_image == null) { return; } @@ -256,12 +259,12 @@ namespace Greenshot.Editor.Drawing } else { - graphics.DrawImage(image, Bounds); + graphics.DrawImage(_image, Bounds); } } public override bool HasDefaultSize => true; - public override Size DefaultSize => image?.Size ?? new Size(32, 32); + public override NativeSize DefaultSize => _image?.Size ?? new NativeSize(32, 32); } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/LineContainer.cs b/src/Greenshot.Editor/Drawing/LineContainer.cs index 1bcf25a81..f48dddec7 100644 --- a/src/Greenshot.Editor/Drawing/LineContainer.cs +++ b/src/Greenshot.Editor/Drawing/LineContainer.cs @@ -23,6 +23,7 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.Serialization; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Adorners; using Greenshot.Editor.Drawing.Fields; @@ -36,7 +37,7 @@ namespace Greenshot.Editor.Drawing [Serializable()] public class LineContainer : DrawableContainer { - public LineContainer(Surface parent) : base(parent) + public LineContainer(ISurface parent) : base(parent) { Init(); } @@ -61,41 +62,40 @@ namespace Greenshot.Editor.Drawing public override void Draw(Graphics graphics, RenderMode rm) { + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + + if (lineThickness <= 0) return; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.None; - int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); - Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - - if (lineThickness > 0) + if (shadow) { - if (shadow) + //draw shadow first + int basealpha = 100; + int alpha = basealpha; + int steps = 5; + int currentStep = 1; + while (currentStep <= steps) { - //draw shadow first - int basealpha = 100; - int alpha = basealpha; - int steps = 5; - int currentStep = 1; - while (currentStep <= steps) - { - using Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); - graphics.DrawLine(shadowCapPen, - Left + currentStep, - Top + currentStep, - Left + currentStep + Width, - Top + currentStep + Height); + using Pen shadowCapPen = new Pen(Color.FromArgb(alpha, 100, 100, 100), lineThickness); + graphics.DrawLine(shadowCapPen, + Left + currentStep, + Top + currentStep, + Left + currentStep + Width, + Top + currentStep + Height); - currentStep++; - alpha -= basealpha / steps; - } + currentStep++; + alpha -= basealpha / steps; } - - using Pen pen = new Pen(lineColor, lineThickness); - graphics.DrawLine(pen, Left, Top, Left + Width, Top + Height); } + + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + using Pen pen = new Pen(lineColor, lineThickness); + graphics.DrawLine(pen, Left, Top, Left + Width, Top + Height); } public override bool ClickableAt(int x, int y) @@ -115,9 +115,9 @@ namespace Greenshot.Editor.Drawing return false; } - protected override ScaleHelper.IDoubleProcessor GetAngleRoundProcessor() + protected override IDoubleProcessor GetAngleRoundProcessor() { - return ScaleHelper.LineAngleRoundBehavior.Instance; + return LineAngleRoundBehavior.INSTANCE; } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/MetafileContainer.cs b/src/Greenshot.Editor/Drawing/MetafileContainer.cs new file mode 100644 index 000000000..3225c4700 --- /dev/null +++ b/src/Greenshot.Editor/Drawing/MetafileContainer.cs @@ -0,0 +1,81 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; + +namespace Greenshot.Editor.Drawing +{ + /// + /// This provides a resizable SVG container, redrawing the SVG in the size the container takes. + /// + [Serializable] + public class MetafileContainer : VectorGraphicsContainer + { + private readonly Metafile _metafile; + + public MetafileContainer(Metafile metafile, ISurface parent) : base(parent) + { + _metafile = metafile; + Size = new NativeSize(metafile.Width/4, metafile.Height/4); + } + + protected override Image ComputeBitmap() + { + var image = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent); + + var dstRect = new NativeRect(0, 0, Width, Height); + using (Graphics graphics = Graphics.FromImage(image)) + { + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + graphics.DrawImage(_metafile, dstRect); + } + + if (RotationAngle == 0) return image; + + var newImage = image.Rotate(RotationAngle); + image.Dispose(); + return newImage; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _metafile?.Dispose(); + } + + base.Dispose(disposing); + } + + public override bool HasDefaultSize => true; + + public override NativeSize DefaultSize => new NativeSize(_metafile.Width, _metafile.Height); + } +} \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/ObfuscateContainer.cs b/src/Greenshot.Editor/Drawing/ObfuscateContainer.cs index 1754ba650..b0c890ffc 100644 --- a/src/Greenshot.Editor/Drawing/ObfuscateContainer.cs +++ b/src/Greenshot.Editor/Drawing/ObfuscateContainer.cs @@ -21,6 +21,7 @@ using System; using System.Runtime.Serialization; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Drawing.Filters; @@ -28,12 +29,12 @@ using Greenshot.Editor.Drawing.Filters; namespace Greenshot.Editor.Drawing { /// - /// Description of ObfuscateContainer. + /// This is a FilterContainer for the obfuscator filters like blur and pixelate. /// [Serializable] public class ObfuscateContainer : FilterContainer { - public ObfuscateContainer(Surface parent) : base(parent) + public ObfuscateContainer(ISurface parent) : base(parent) { Init(); } diff --git a/src/Greenshot.Editor/Drawing/RectangleContainer.cs b/src/Greenshot.Editor/Drawing/RectangleContainer.cs index 5e38fcf4b..717e1a593 100644 --- a/src/Greenshot.Editor/Drawing/RectangleContainer.cs +++ b/src/Greenshot.Editor/Drawing/RectangleContainer.cs @@ -23,6 +23,9 @@ using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Helpers; @@ -35,7 +38,7 @@ namespace Greenshot.Editor.Drawing [Serializable] public class RectangleContainer : DrawableContainer { - public RectangleContainer(Surface parent) : base(parent) + public RectangleContainer(ISurface parent) : base(parent) { Init(); } @@ -69,7 +72,7 @@ namespace Greenshot.Editor.Drawing Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR, Color.Red); Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR, Color.Transparent); bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); DrawRectangle(rect, graphics, rm, lineThickness, lineColor, fillColor, shadow); } @@ -77,14 +80,14 @@ namespace Greenshot.Editor.Drawing /// /// This method can also be used from other containers, if the right values are passed! /// - /// + /// NativeRect /// /// /// /// /// /// - public static void DrawRectangle(Rectangle rect, Graphics graphics, RenderMode rm, int lineThickness, Color lineColor, Color fillColor, bool shadow) + public static void DrawRectangle(NativeRect rect, Graphics graphics, RenderMode rm, int lineThickness, Color lineColor, Color fillColor, bool shadow) { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; @@ -105,11 +108,11 @@ namespace Greenshot.Editor.Drawing { Width = lineVisible ? lineThickness : 1 }; - Rectangle shadowRect = GuiRectangle.GetGuiRectangle( + var shadowRect = new NativeRect( rect.Left + currentStep, rect.Top + currentStep, rect.Width, - rect.Height); + rect.Height).Normalize(); graphics.DrawRectangle(shadowPen, shadowRect); currentStep++; alpha -= basealpha / steps; @@ -133,15 +136,14 @@ namespace Greenshot.Editor.Drawing public override bool ClickableAt(int x, int y) { - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS) + 10; Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); return RectangleClickableAt(rect, lineThickness, fillColor, x, y); } - - public static bool RectangleClickableAt(Rectangle rect, int lineThickness, Color fillColor, int x, int y) + public static bool RectangleClickableAt(NativeRect rect, int lineThickness, Color fillColor, int x, int y) { // If we clicked inside the rectangle and it's visible we are clickable at. if (!Color.Transparent.Equals(fillColor)) diff --git a/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs b/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs index 2b189945d..e1f37544b 100644 --- a/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs +++ b/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs @@ -24,6 +24,9 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; using Greenshot.Editor.Helpers; @@ -61,11 +64,10 @@ namespace Greenshot.Editor.Drawing protected override void OnDeserialized(StreamingContext streamingContext) { base.OnDeserialized(streamingContext); - InitAdorner(Color.Green, _storedTargetGripperLocation); + InitTargetAdorner(_storedTargetGripperLocation); } - public SpeechbubbleContainer(Surface parent) - : base(parent) + public SpeechbubbleContainer(ISurface parent) : base(parent) { } @@ -94,8 +96,8 @@ namespace Greenshot.Editor.Drawing { if (TargetAdorner == null) { - _initialGripperPoint = new Point(mouseX, mouseY); - InitAdorner(Color.Green, new Point(mouseX, mouseY)); + _initialGripperPoint = new NativePoint(mouseX, mouseY); + InitTargetAdorner(_initialGripperPoint); } return base.HandleMouseDown(mouseX, mouseY); @@ -118,8 +120,8 @@ namespace Greenshot.Editor.Drawing int xOffset = leftAligned ? -20 : 20; int yOffset = topAligned ? -20 : 20; - Point newGripperLocation = _initialGripperPoint; - newGripperLocation.Offset(xOffset, yOffset); + NativePoint initialGripperPoint = _initialGripperPoint; + NativePoint newGripperLocation = initialGripperPoint.Offset(xOffset, yOffset); if (TargetAdorner.Location != newGripperLocation) { @@ -134,23 +136,27 @@ namespace Greenshot.Editor.Drawing /// /// The DrawingBound should be so close as possible to the shape, so we don't invalidate to much. /// - public override Rectangle DrawingBounds + public override NativeRect DrawingBounds { get { - if (Status != EditStatus.UNDRAWN) - { - int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); - Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); - bool shadow = GetFieldValueAsBool(FieldType.SHADOW); - using Pen pen = new Pen(lineColor, lineThickness); - int inflateValue = lineThickness + 2 + (shadow ? 6 : 0); - using GraphicsPath tailPath = CreateTail(); - return Rectangle.Inflate(Rectangle.Union(Rectangle.Round(tailPath.GetBounds(new Matrix(), pen)), GuiRectangle.GetGuiRectangle(Left, Top, Width, Height)), - inflateValue, inflateValue); - } + if (Status == EditStatus.UNDRAWN) return NativeRect.Empty; + + int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); + Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); + bool shadow = GetFieldValueAsBool(FieldType.SHADOW); + using Pen pen = new Pen(lineColor, lineThickness); + int inflateValue = lineThickness + 2 + (shadow ? 6 : 0); + using GraphicsPath tailPath = CreateTail(); + + var bubbleBounds = new NativeRect(Left, Top, Width, Height).Normalize(); + using var matrix = new Matrix(); + + var tailBounds = Rectangle.Round(tailPath.GetBounds(matrix, pen)); + + var drawingBoundsWithoutSafety = bubbleBounds.Union(tailBounds); + return drawingBoundsWithoutSafety.Inflate(inflateValue, inflateValue); - return Rectangle.Empty; } } @@ -162,9 +168,9 @@ namespace Greenshot.Editor.Drawing private GraphicsPath CreateBubble(int lineThickness) { GraphicsPath bubble = new GraphicsPath(); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); - Rectangle bubbleRect = GuiRectangle.GetGuiRectangle(0, 0, rect.Width, rect.Height); + var bubbleRect = new NativeRect(0, 0, rect.Width, rect.Height).Normalize(); // adapt corner radius to small rectangle dimensions int smallerSideLength = Math.Min(bubbleRect.Width, bubbleRect.Height); int cornerRadius = Math.Min(30, smallerSideLength / 2 - lineThickness); @@ -196,7 +202,7 @@ namespace Greenshot.Editor.Drawing /// private GraphicsPath CreateTail() { - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); int tailLength = GeometryHelper.Distance2D(rect.Left + (rect.Width / 2), rect.Top + (rect.Height / 2), TargetAdorner.Location.X, TargetAdorner.Location.Y); int tailWidth = (Math.Abs(rect.Width) + Math.Abs(rect.Height)) / 20; @@ -246,7 +252,7 @@ namespace Greenshot.Editor.Drawing int lineThickness = GetFieldValueAsInt(FieldType.LINE_THICKNESS); bool lineVisible = lineThickness > 0 && Colors.IsVisible(lineColor); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); if (Selected && renderMode == RenderMode.EDIT) { diff --git a/src/Greenshot.Editor/Drawing/StepLabelContainer.cs b/src/Greenshot.Editor/Drawing/StepLabelContainer.cs index 0e7c27516..7edecc4f8 100644 --- a/src/Greenshot.Editor/Drawing/StepLabelContainer.cs +++ b/src/Greenshot.Editor/Drawing/StepLabelContainer.cs @@ -24,9 +24,12 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; +using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; -using Greenshot.Editor.Helpers; namespace Greenshot.Editor.Drawing { @@ -41,9 +44,9 @@ namespace Greenshot.Editor.Drawing private readonly bool _drawAsRectangle = false; - public StepLabelContainer(Surface parent) : base(parent) + public StepLabelContainer(ISurface parent) : base(parent) { - parent.AddStepLabel(this); + InternalParent?.AddStepLabel(this); InitContent(); Init(); } @@ -72,11 +75,10 @@ namespace Greenshot.Editor.Drawing [OnSerializing] private void SetValuesOnSerializing(StreamingContext context) { - if (Parent != null) - { - Number = ((Surface) Parent).CountStepLabels(this); - _counterStart = ((Surface) Parent).CounterStart; - } + if (InternalParent == null) return; + + Number = InternalParent.CountStepLabels(this); + _counterStart = InternalParent.CounterStart; } /// @@ -97,26 +99,26 @@ namespace Greenshot.Editor.Drawing /// Add the StepLabel to the parent /// /// - protected override void SwitchParent(Surface newParent) + protected override void SwitchParent(ISurface newParent) { if (newParent == Parent) { return; } - ((Surface) Parent)?.RemoveStepLabel(this); - base.SwitchParent(newParent); - if (newParent == null) + if (newParent is not Surface newParentSurface) { return; } + InternalParent?.RemoveStepLabel(this); + base.SwitchParent(newParent); // Make sure the counter start is restored (this unfortunately happens multiple times... -> hack) - newParent.CounterStart = _counterStart; - newParent.AddStepLabel(this); + newParentSurface.CounterStart = _counterStart; + newParentSurface.AddStepLabel(this); } - public override Size DefaultSize => new Size(30, 30); + public override NativeSize DefaultSize => new NativeSize(30, 30); public override bool InitContent() { @@ -186,13 +188,15 @@ namespace Greenshot.Editor.Drawing /// public override void Draw(Graphics graphics, RenderMode rm) { + if (Width == 0 || Height == 0) { return; } + graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.None; graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; string text = ((Surface) Parent).CountStepLabels(this).ToString(); - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); Color lineColor = GetFieldValueAsColor(FieldType.LINE_COLOR); if (_drawAsRectangle) @@ -204,15 +208,23 @@ namespace Greenshot.Editor.Drawing EllipseContainer.DrawEllipse(rect, graphics, rm, 0, Color.Transparent, fillColor, false); } - float fontSize = Math.Min(Width, Height) / 1.4f; - using FontFamily fam = new FontFamily(FontFamily.GenericSansSerif.Name); - using Font font = new Font(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel); + using FontFamily fam = new(FontFamily.GenericSansSerif.Name); + + //calculate new font size based on ratio from text height and text width + float initialFontSize = Math.Min(Math.Abs(Width), Math.Abs(Height)); + using Font Measurefont = new(fam, initialFontSize, FontStyle.Bold, GraphicsUnit.Pixel); + var fontSize = initialFontSize * TextRenderer.MeasureText(text, Measurefont).Height / TextRenderer.MeasureText(text, Measurefont).Width; + + //static scale for optimal fit + fontSize *= 0.7f; + + using Font font = new(fam, fontSize, FontStyle.Bold, GraphicsUnit.Pixel); TextContainer.DrawText(graphics, rect, 0, lineColor, false, _stringFormat, text, font); } public override bool ClickableAt(int x, int y) { - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); Color fillColor = GetFieldValueAsColor(FieldType.FILL_COLOR); if (_drawAsRectangle) { diff --git a/src/Greenshot.Editor/Drawing/Surface.cs b/src/Greenshot.Editor/Drawing/Surface.cs index 5093ed201..6d47a67a6 100644 --- a/src/Greenshot.Editor/Drawing/Surface.cs +++ b/src/Greenshot.Editor/Drawing/Surface.cs @@ -26,8 +26,12 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Runtime.Serialization.Formatters.Binary; +using System.ServiceModel.Security; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Controls; using Greenshot.Base.Core; using Greenshot.Base.Effects; @@ -37,7 +41,7 @@ using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Drawing.Adorners; using Greenshot.Editor.Configuration; using Greenshot.Editor.Drawing.Fields; -using Greenshot.Editor.Helpers; +using Greenshot.Editor.Helpers; using Greenshot.Editor.Memento; using log4net; @@ -49,7 +53,6 @@ namespace Greenshot.Editor.Drawing public sealed class Surface : Control, ISurface, INotifyPropertyChanged { private static readonly ILog LOG = LogManager.GetLogger(typeof(Surface)); - public static int Count; private static readonly CoreConfiguration conf = IniConfig.GetIniSection(); // Property to identify the Surface ID @@ -144,6 +147,17 @@ namespace Greenshot.Editor.Drawing remove => _shadowChanged -= value; } + + [NonSerialized] private int _currentDpi = 96; + /// + /// The most recent DPI value that was used + /// + public int CurrentDpi + { + get => _currentDpi; + set => _currentDpi = value; + } + /// /// inUndoRedo makes sure we don't undo/redo while in a undo/redo action /// @@ -207,7 +221,7 @@ namespace Greenshot.Editor.Drawing [NonSerialized] private IDrawableContainer _undrawnElement; /// - /// the cropcontainer, when cropping this is set, do not serialize + /// the crop container, when cropping this is set, do not serialize /// [NonSerialized] private IDrawableContainer _cropContainer; @@ -294,7 +308,7 @@ namespace Greenshot.Editor.Drawing /// /// all elements on the surface, needed with serialization /// - private FieldAggregator _fieldAggregator; + private IFieldAggregator _fieldAggregator; /// /// the cursor container, needed with serialization as we need a direct acces to it. @@ -355,7 +369,7 @@ namespace Greenshot.Editor.Drawing /// The field aggregator is that which is used to have access to all the fields inside the currently selected elements. /// e.g. used to decided if and which line thickness is shown when multiple elements are selected. /// - public FieldAggregator FieldAggregator + public IFieldAggregator FieldAggregator { get => _fieldAggregator; set => _fieldAggregator = value; @@ -453,8 +467,9 @@ namespace Greenshot.Editor.Drawing /// Adjust UI elements to the supplied DPI settings /// /// - public void AdjustToDpi(uint dpi) + public void AdjustToDpi(int dpi) { + CurrentDpi = dpi; foreach (var element in this._elements) { element.AdjustToDpi(dpi); @@ -467,7 +482,6 @@ namespace Greenshot.Editor.Drawing public Surface() { _fieldAggregator = new FieldAggregator(this); - Count++; _elements = new DrawableContainerList(_uniqueId); selectedElements = new DrawableContainerList(_uniqueId); LOG.Debug("Creating surface!"); @@ -530,8 +544,8 @@ namespace Greenshot.Editor.Drawing // check if cursor is captured, and visible if (capture.Cursor != null && capture.CursorVisible) { - Rectangle cursorRect = new Rectangle(capture.CursorLocation, capture.Cursor.Size); - Rectangle captureRect = new Rectangle(Point.Empty, capture.Image.Size); + var cursorRect = new NativeRect(capture.CursorLocation, capture.Cursor.Size); + var captureRect = new NativeRect(NativePoint.Empty, capture.Image.Size); // check if cursor is on the capture, otherwise we leave it out. if (cursorRect.IntersectsWith(captureRect)) { @@ -550,7 +564,6 @@ namespace Greenshot.Editor.Drawing { if (disposing) { - Count--; LOG.Debug("Disposing surface!"); if (_buffer != null) { @@ -711,15 +724,20 @@ namespace Greenshot.Editor.Drawing try { BinaryFormatter binaryRead = new BinaryFormatter(); + binaryRead.Binder = new BinaryFormatterHelper(); IDrawableContainerList loadedElements = (IDrawableContainerList) binaryRead.Deserialize(streamRead); loadedElements.Parent = this; - // Make sure the steplabels are sorted accoring to their number + // Make sure the steplabels are sorted according to their number _stepLabels.Sort((p1, p2) => p1.Number.CompareTo(p2.Number)); DeselectAllElements(); AddElements(loadedElements); SelectElements(loadedElements); FieldAggregator.BindElements(loadedElements); } + catch (SecurityAccessDeniedException) + { + throw; + } catch (Exception e) { LOG.Error("Error serializing elements from stream.", e); @@ -913,6 +931,27 @@ namespace Greenshot.Editor.Drawing } } + /// + /// This will help to fit the container to the surface + /// + /// IDrawableContainer + private void FitContainer(IDrawableContainer drawableContainer) + { + double factor = 1; + if (drawableContainer.Width > this.Width) + { + factor = drawableContainer.Width / (double)Width; + } + if (drawableContainer.Height > this.Height) + { + var otherFactor = drawableContainer.Height / (double)Height; + factor = Math.Max(factor, otherFactor); + } + + drawableContainer.Width = (int)(drawableContainer.Width / factor); + drawableContainer.Height = (int)(drawableContainer.Height / factor); + } + /// /// Handle the drag/drop /// @@ -920,27 +959,32 @@ namespace Greenshot.Editor.Drawing /// private void OnDragDrop(object sender, DragEventArgs e) { - Point mouse = PointToClient(new Point(e.X, e.Y)); + NativePoint mouse = PointToClient(new NativePoint(e.X, e.Y)); if (e.Data.GetDataPresent("Text")) { string possibleUrl = ClipboardHelper.GetText(e.Data); // Test if it's an url and try to download the image so we have it in the original form if (possibleUrl != null && possibleUrl.StartsWith("http")) { - using Image image = NetworkHelper.DownloadImage(possibleUrl); - if (image != null) + var drawableContainer = NetworkHelper.DownloadImageAsDrawableContainer(possibleUrl); + if (drawableContainer != null) { - AddImageContainer(image, mouse.X, mouse.Y); + drawableContainer.Left = Location.X; + drawableContainer.Top = Location.Y; + FitContainer(drawableContainer); + AddElement(drawableContainer); return; } } } - foreach (Image image in ClipboardHelper.GetImages(e.Data)) + foreach (var drawableContainer in ClipboardHelper.GetDrawables(e.Data)) { - AddImageContainer(image, mouse.X, mouse.Y); - mouse.Offset(10, 10); - image.Dispose(); + drawableContainer.Left = mouse.X; + drawableContainer.Top = mouse.Y; + FitContainer(drawableContainer); + AddElement(drawableContainer); + mouse = mouse.Offset(10, 10); } } @@ -949,16 +993,17 @@ namespace Greenshot.Editor.Drawing /// /// Auto crop the image /// + /// NativeRect with optional area to find a crop region /// true if cropped - public bool AutoCrop() + public bool AutoCrop(NativeRect? cropArea = null) { - Rectangle cropRectangle; + NativeRect cropRectangle; using (Image tmpImage = GetImageForExport()) { - cropRectangle = ImageHelper.FindAutoCropRectangle(tmpImage, conf.AutoCropDifference); + cropRectangle = ImageHelper.FindAutoCropRectangle(tmpImage, conf.AutoCropDifference, cropArea); } - if (!IsCropPossible(ref cropRectangle)) + if (!IsCropPossible(ref cropRectangle, CropContainer.CropModes.AutoCrop)) { return false; } @@ -986,14 +1031,12 @@ namespace Greenshot.Editor.Drawing public void Clear(Color newColor) { //create a blank bitmap the same size as original - Bitmap newBitmap = ImageHelper.CreateEmptyLike(Image, Color.Empty); - if (newBitmap != null) - { - // Make undoable - MakeUndoable(new SurfaceBackgroundChangeMemento(this, null), false); - SetImage(newBitmap, false); - Invalidate(); - } + Bitmap newBitmap = ImageHelper.CreateEmptyLike(Image, newColor); + if (newBitmap == null) return; + // Make undoable + MakeUndoable(new SurfaceBackgroundChangeMemento(this, null), false); + SetImage(newBitmap, false); + Invalidate(); } /// @@ -1007,7 +1050,7 @@ namespace Greenshot.Editor.Drawing Application.DoEvents(); try { - Rectangle imageRectangle = new Rectangle(Point.Empty, Image.Size); + var imageRectangle = new NativeRect(NativePoint.Empty, Image.Size); Matrix matrix = new Matrix(); Image newImage = ImageHelper.ApplyEffect(Image, effect, matrix); if (newImage != null) @@ -1018,7 +1061,7 @@ namespace Greenshot.Editor.Drawing MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); SetImage(newImage, false); Invalidate(); - if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, newImage.Size))) + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new NativeRect(NativePoint.Empty, newImage.Size))) { _surfaceSizeChanged(this, null); } @@ -1039,31 +1082,48 @@ namespace Greenshot.Editor.Drawing /// /// check if a crop is possible /// - /// + /// Rectangle adapted to the dimensions of the image + /// CropModes /// true if this is possible - public bool IsCropPossible(ref Rectangle cropRectangle) + public bool IsCropPossible(ref NativeRect cropRectangle, CropContainer.CropModes cropMode) { - cropRectangle = GuiRectangle.GetGuiRectangle(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, cropRectangle.Height); + cropRectangle = new NativeRect(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, cropRectangle.Height).Normalize(); + //Fitting the rectangle to the dimensions of the image if (cropRectangle.Left < 0) { - cropRectangle = new Rectangle(0, cropRectangle.Top, cropRectangle.Width + cropRectangle.Left, cropRectangle.Height); + cropRectangle = new NativeRect(0, cropRectangle.Top, cropRectangle.Width + cropRectangle.Left, cropRectangle.Height); } if (cropRectangle.Top < 0) { - cropRectangle = new Rectangle(cropRectangle.Left, 0, cropRectangle.Width, cropRectangle.Height + cropRectangle.Top); + cropRectangle = new NativeRect(cropRectangle.Left, 0, cropRectangle.Width, cropRectangle.Height + cropRectangle.Top); } if (cropRectangle.Left + cropRectangle.Width > Image.Width) { - cropRectangle = new Rectangle(cropRectangle.Left, cropRectangle.Top, Image.Width - cropRectangle.Left, cropRectangle.Height); + cropRectangle = new NativeRect(cropRectangle.Left, cropRectangle.Top, Image.Width - cropRectangle.Left, cropRectangle.Height); } if (cropRectangle.Top + cropRectangle.Height > Image.Height) { - cropRectangle = new Rectangle(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, Image.Height - cropRectangle.Top); + cropRectangle = new NativeRect(cropRectangle.Left, cropRectangle.Top, cropRectangle.Width, Image.Height - cropRectangle.Top); } + // special condition for vertical + if(cropMode == CropContainer.CropModes.Vertical && cropRectangle.Width == Image.Width) + { + //crop out the hole image is not allowed + return false; + } + + // special condition for vertical + if (cropMode == CropContainer.CropModes.Horizontal && cropRectangle.Height == Image.Height) + { + //crop out the hole image is not allowed + return false; + } + + //condition for all other crop modes if (cropRectangle.Height > 0 && cropRectangle.Width > 0) { return true; @@ -1080,16 +1140,15 @@ namespace Greenshot.Editor.Drawing /// Message itself public void SendMessageEvent(object source, SurfaceMessageTyp messageType, string message) { - if (_surfaceMessage != null) + if (_surfaceMessage == null) return; + + var eventArgs = new SurfaceMessageEventArgs { - var eventArgs = new SurfaceMessageEventArgs - { - Message = message, - MessageType = messageType, - Surface = this - }; - _surfaceMessage(source, eventArgs); - } + Message = message, + MessageType = messageType, + Surface = this + }; + _surfaceMessage(source, eventArgs); } /// @@ -1097,16 +1156,15 @@ namespace Greenshot.Editor.Drawing /// /// Who send /// new color - public void UpdateForegroundColorEvent(object source, Color color) + private void UpdateForegroundColorEvent(object source, Color color) { - if (_foregroundColorChanged != null) + if (_foregroundColorChanged == null) return; + + var eventArgs = new SurfaceForegroundColorEventArgs { - var eventArgs = new SurfaceForegroundColorEventArgs - { - Color = color, - }; - _foregroundColorChanged(source, eventArgs); - } + Color = color, + }; + _foregroundColorChanged(source, eventArgs); } /// @@ -1114,16 +1172,15 @@ namespace Greenshot.Editor.Drawing /// /// Who send /// new color - public void UpdateBackgroundColorEvent(object source, Color color) + private void UpdateBackgroundColorEvent(object source, Color color) { - if (_lineThicknessChanged != null) + if (_lineThicknessChanged == null) return; + + var eventArgs = new SurfaceBackgroundColorEventArgs { - var eventArgs = new SurfaceBackgroundColorEventArgs - { - Color = color, - }; - _backgroundColorChanged(source, eventArgs); - } + Color = color, + }; + _backgroundColorChanged(source, eventArgs); } /// @@ -1131,16 +1188,15 @@ namespace Greenshot.Editor.Drawing /// /// Who send /// new thickness - public void UpdateLineThicknessEvent(object source, int thickness) + private void UpdateLineThicknessEvent(object source, int thickness) { - if (_lineThicknessChanged != null) + if (_lineThicknessChanged == null) return; + + var eventArgs = new SurfaceLineThicknessEventArgs { - var eventArgs = new SurfaceLineThicknessEventArgs - { - Thickness = thickness, - }; - _lineThicknessChanged(source, eventArgs); - } + Thickness = thickness, + }; + _lineThicknessChanged(source, eventArgs); } /// @@ -1148,61 +1204,173 @@ namespace Greenshot.Editor.Drawing /// /// Who send /// has shadow - public void UpdateShadowEvent(object source, bool hasShadow) + private void UpdateShadowEvent(object source, bool hasShadow) { - if (_shadowChanged != null) - { - var eventArgs = new SurfaceShadowEventArgs - { - HasShadow = hasShadow, - }; - _shadowChanged(source, eventArgs); - } + if (_shadowChanged == null) return; + + var eventArgs = new SurfaceShadowEventArgs + { + HasShadow = hasShadow, + }; + _shadowChanged(source, eventArgs); } /// /// Crop the surface /// - /// - /// - public bool ApplyCrop(Rectangle cropRectangle) + /// NativeRect that remains + /// bool + public bool ApplyCrop(NativeRect cropRectangle) { - if (IsCropPossible(ref cropRectangle)) + if (!IsCropPossible(ref cropRectangle, CropContainer.CropModes.Default)) return false; + + var imageRectangle = new NativeRect(NativePoint.Empty, Image.Size); + Bitmap tmpImage; + // Make sure we have information, this this fails + try { - Rectangle imageRectangle = new Rectangle(Point.Empty, Image.Size); - Bitmap tmpImage; - // Make sure we have information, this this fails - try - { - tmpImage = ImageHelper.CloneArea(Image, cropRectangle, PixelFormat.DontCare); - } - catch (Exception ex) - { - ex.Data.Add("CropRectangle", cropRectangle); - ex.Data.Add("Width", Image.Width); - ex.Data.Add("Height", Image.Height); - ex.Data.Add("Pixelformat", Image.PixelFormat); - throw; - } - - Matrix matrix = new Matrix(); - matrix.Translate(-cropRectangle.Left, -cropRectangle.Top, MatrixOrder.Append); - // Make undoable - MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); - - // Do not dispose otherwise we can't undo the image! - SetImage(tmpImage, false); - _elements.Transform(matrix); - if (_surfaceSizeChanged != null && !imageRectangle.Equals(new Rectangle(Point.Empty, tmpImage.Size))) - { - _surfaceSizeChanged(this, null); - } - - Invalidate(); - return true; + tmpImage = ImageHelper.CloneArea(Image, cropRectangle, PixelFormat.DontCare); + } + catch (Exception ex) + { + ex.Data.Add("CropRectangle", cropRectangle); + ex.Data.Add("Width", Image.Width); + ex.Data.Add("Height", Image.Height); + ex.Data.Add("Pixelformat", Image.PixelFormat); + throw; } - return false; + var matrix = new Matrix(); + matrix.Translate(-cropRectangle.Left, -cropRectangle.Top, MatrixOrder.Append); + // Make undoable + MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); + + // Do not dispose otherwise we can't undo the image! + SetImage(tmpImage, false); + _elements.Transform(matrix); + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new NativeRect(NativePoint.Empty, tmpImage.Size))) + { + _surfaceSizeChanged(this, null); + } + + Invalidate(); + return true; + } + + /// + /// Crop out the surface + /// Splits the image in 3 parts(top, middle, bottom). Crop out the middle and joins top and bottom. + /// + /// NativeRect of the middle part + /// bool + private bool ApplyHorizontalCrop(NativeRect cropRectangle) + { + if (!IsCropPossible(ref cropRectangle, CropContainer.CropModes.Horizontal)) return false; + + var imageRectangle = new NativeRect(NativePoint.Empty, Image.Size); + var topRectangle = new NativeRect(0, 0, Image.Size.Width, cropRectangle.Top); + var bottomRectangle = new NativeRect(0, cropRectangle.Top + cropRectangle.Height, Image.Size.Width, Image.Size.Height - cropRectangle.Top - cropRectangle.Height); + + Bitmap newImage; + try + { + newImage = new Bitmap(Image.Size.Width, Image.Size.Height - cropRectangle.Height); + + using var graphics = Graphics.FromImage(newImage); + + var insertPositionTop = 0; + if (topRectangle.Height > 0) + { + graphics.DrawImage(Image, new NativeRect(0, insertPositionTop, topRectangle.Width, topRectangle.Height), topRectangle, GraphicsUnit.Pixel); + insertPositionTop += topRectangle.Height; + } + if (bottomRectangle.Height > 0) + { + graphics.DrawImage(Image, new NativeRect(0, insertPositionTop, bottomRectangle.Width, bottomRectangle.Height), bottomRectangle, GraphicsUnit.Pixel); + } + } + catch (Exception ex) + { + ex.Data.Add("CropRectangle", cropRectangle); + ex.Data.Add("Width", Image.Width); + ex.Data.Add("Height", Image.Height); + ex.Data.Add("Pixelformat", Image.PixelFormat); + throw; + } + var matrix = new Matrix(); + matrix.Translate(0, -(cropRectangle.Top + cropRectangle.Height), MatrixOrder.Append); + // Make undoable + MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); + + // Do not dispose otherwise we can't undo the image! + SetImage(newImage, false); + + _elements.Transform(matrix); + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new NativeRect(NativePoint.Empty, newImage.Size))) + { + _surfaceSizeChanged(this, null); + } + + Invalidate(); + return true; + } + + /// + /// Crop out the surface + /// Splits the image in 3 parts(left, middle, right). Crop out the middle and joins top and bottom. + /// + /// NativeRect of the middle part + /// bool + private bool ApplyVerticalCrop(NativeRect cropRectangle) + { + if (!IsCropPossible(ref cropRectangle, CropContainer.CropModes.Vertical)) return false; + + var imageRectangle = new NativeRect(NativePoint.Empty, Image.Size); + var leftRectangle = new NativeRect(0, 0, cropRectangle.Left, Image.Size.Height); + var rightRectangle = new NativeRect(cropRectangle.Left + cropRectangle.Width, 0, Image.Size.Width - cropRectangle.Width - cropRectangle.Left, Image.Size.Height); + Bitmap newImage; + try + { + newImage = new Bitmap(Image.Size.Width - cropRectangle.Width, Image.Size.Height); + + using var graphics = Graphics.FromImage(newImage); + + var insertPositionLeft = 0; + if (leftRectangle.Width > 0) + { + graphics.DrawImage(Image, new NativeRect(insertPositionLeft, 0, leftRectangle.Width, leftRectangle.Height), leftRectangle , GraphicsUnit.Pixel); + insertPositionLeft += leftRectangle.Width; + } + + if (rightRectangle.Width > 0) + { + graphics.DrawImage(Image, new NativeRect(insertPositionLeft, 0, rightRectangle.Width, rightRectangle.Height), rightRectangle, GraphicsUnit.Pixel); + } + } + catch (Exception ex) + { + ex.Data.Add("CropRectangle", cropRectangle); + ex.Data.Add("Width", Image.Width); + ex.Data.Add("Height", Image.Height); + ex.Data.Add("Pixelformat", Image.PixelFormat); + throw; + } + var matrix = new Matrix(); + matrix.Translate(-cropRectangle.Left - cropRectangle.Width, 0, MatrixOrder.Append); + // Make undoable + MakeUndoable(new SurfaceBackgroundChangeMemento(this, matrix), false); + + // Do not dispose otherwise we can't undo the image! + SetImage(newImage, false); + + _elements.Transform(matrix); + if (_surfaceSizeChanged != null && !imageRectangle.Equals(new NativeRect(NativePoint.Empty, newImage.Size))) + { + _surfaceSizeChanged(this, null); + } + + Invalidate(); + return true; } /// @@ -1234,15 +1402,14 @@ namespace Greenshot.Editor.Drawing { foreach (IAdorner adorner in drawableContainer.Adorners) { - if (adorner.IsActive || adorner.HitTest(mouseEventArgs.Location)) + if (!adorner.IsActive && !adorner.HitTest(mouseEventArgs.Location)) continue; + + if (adorner.Cursor != null) { - if (adorner.Cursor != null) - { - Cursor = adorner.Cursor; - } - - return adorner; + Cursor = adorner.Cursor; } + + return adorner; } } @@ -1473,48 +1640,47 @@ namespace Greenshot.Editor.Drawing Cursor = DrawingMode != DrawingModes.None ? Cursors.Cross : Cursors.Default; - if (_mouseDown) + if (!_mouseDown) return; + + if (_mouseDownElement != null) { - if (_mouseDownElement != null) + // an element is currently dragged + _mouseDownElement.Invalidate(); + selectedElements.Invalidate(); + // Move the element + if (_mouseDownElement.Selected) { - // an element is currently dragged - _mouseDownElement.Invalidate(); - selectedElements.Invalidate(); - // Move the element - if (_mouseDownElement.Selected) + if (!_isSurfaceMoveMadeUndoable) { - if (!_isSurfaceMoveMadeUndoable) - { - // Only allow one undoable per mouse-down/move/up "cycle" - _isSurfaceMoveMadeUndoable = true; - selectedElements.MakeBoundsChangeUndoable(false); - } - - // dragged element has been selected before -> move all - selectedElements.MoveBy(currentMouse.X - _mouseStart.X, currentMouse.Y - _mouseStart.Y); - } - else - { - if (!_isSurfaceMoveMadeUndoable) - { - // Only allow one undoable per mouse-down/move/up "cycle" - _isSurfaceMoveMadeUndoable = true; - _mouseDownElement.MakeBoundsChangeUndoable(false); - } - - // dragged element is not among selected elements -> just move dragged one - _mouseDownElement.MoveBy(currentMouse.X - _mouseStart.X, currentMouse.Y - _mouseStart.Y); + // Only allow one undoable per mouse-down/move/up "cycle" + _isSurfaceMoveMadeUndoable = true; + selectedElements.MakeBoundsChangeUndoable(false); } - _mouseStart = currentMouse; - _mouseDownElement.Invalidate(); - _modified = true; + // dragged element has been selected before -> move all + selectedElements.MoveBy(currentMouse.X - _mouseStart.X, currentMouse.Y - _mouseStart.Y); } - else if (_drawingElement != null) + else { - _drawingElement.HandleMouseMove(currentMouse.X, currentMouse.Y); - _modified = true; + if (!_isSurfaceMoveMadeUndoable) + { + // Only allow one undoable per mouse-down/move/up "cycle" + _isSurfaceMoveMadeUndoable = true; + _mouseDownElement.MakeBoundsChangeUndoable(false); + } + + // dragged element is not among selected elements -> just move dragged one + _mouseDownElement.MoveBy(currentMouse.X - _mouseStart.X, currentMouse.Y - _mouseStart.Y); } + + _mouseStart = currentMouse; + _mouseDownElement.Invalidate(); + _modified = true; + } + else if (_drawingElement != null) + { + _drawingElement.HandleMouseMove(currentMouse.X, currentMouse.Y); + _modified = true; } } @@ -1561,9 +1727,9 @@ namespace Greenshot.Editor.Drawing return GetImage(RenderMode.EXPORT); } - private static Rectangle ZoomClipRectangle(Rectangle rc, double scale, int inflateAmount = 0) + private static NativeRect ZoomClipRectangle(NativeRect rc, double scale, int inflateAmount = 0) { - rc = new Rectangle( + rc = new NativeRect( (int) (rc.X * scale), (int) (rc.Y * scale), (int) (rc.Width * scale) + 1, @@ -1574,11 +1740,10 @@ namespace Greenshot.Editor.Drawing inflateAmount = (int) (inflateAmount * scale); } - rc.Inflate(inflateAmount, inflateAmount); - return rc; + return rc.Inflate(inflateAmount, inflateAmount); } - public void InvalidateElements(Rectangle rc) + public void InvalidateElements(NativeRect rc) => Invalidate(ZoomClipRectangle(rc, _zoomFactor, 1)); /// @@ -1589,8 +1754,8 @@ namespace Greenshot.Editor.Drawing private void SurfacePaint(object sender, PaintEventArgs paintEventArgs) { Graphics targetGraphics = paintEventArgs.Graphics; - Rectangle targetClipRectangle = paintEventArgs.ClipRectangle; - if (Rectangle.Empty.Equals(targetClipRectangle)) + NativeRect targetClipRectangle = paintEventArgs.ClipRectangle; + if (targetClipRectangle.IsEmpty) { LOG.Debug("Empty cliprectangle??"); return; @@ -1604,18 +1769,16 @@ namespace Greenshot.Editor.Drawing int verticalCorrection = targetClipRectangle.Top % (int) _zoomFactor.Numerator; if (horizontalCorrection != 0) { - targetClipRectangle.X -= horizontalCorrection; - targetClipRectangle.Width += horizontalCorrection; + targetClipRectangle = targetClipRectangle.ChangeX(-horizontalCorrection).ChangeWidth(horizontalCorrection); } if (verticalCorrection != 0) { - targetClipRectangle.Y -= verticalCorrection; - targetClipRectangle.Height += verticalCorrection; + targetClipRectangle = targetClipRectangle.ChangeY(-verticalCorrection).ChangeHeight(verticalCorrection); } } - Rectangle imageClipRectangle = ZoomClipRectangle(targetClipRectangle, _zoomFactor.Inverse(), 2); + NativeRect imageClipRectangle = ZoomClipRectangle(targetClipRectangle, _zoomFactor.Inverse(), 2); if (_elements.HasIntersectingFilters(imageClipRectangle) || _zoomFactor > Fraction.Identity) { @@ -1696,7 +1859,7 @@ namespace Greenshot.Editor.Drawing } } - private void DrawSmoothImage(Graphics targetGraphics, Image image, Rectangle imageClipRectangle) + private void DrawSmoothImage(Graphics targetGraphics, Image image, NativeRect imageClipRectangle) { var state = targetGraphics.Save(); targetGraphics.SmoothingMode = SmoothingMode.HighQuality; @@ -1709,7 +1872,7 @@ namespace Greenshot.Editor.Drawing targetGraphics.Restore(state); } - private void DrawSharpImage(Graphics targetGraphics, Image image, Rectangle imageClipRectangle) + private void DrawSharpImage(Graphics targetGraphics, Image image, NativeRect imageClipRectangle) { var state = targetGraphics.Save(); targetGraphics.SmoothingMode = SmoothingMode.None; @@ -1722,7 +1885,7 @@ namespace Greenshot.Editor.Drawing targetGraphics.Restore(state); } - private void DrawBackground(Graphics targetGraphics, Rectangle clipRectangle) + private void DrawBackground(Graphics targetGraphics, NativeRect clipRectangle) { // check if we need to draw the checkerboard if (Image.IsAlphaPixelFormat(Image.PixelFormat) && _transparencyBackgroundBrush != null) @@ -1774,7 +1937,7 @@ namespace Greenshot.Editor.Drawing element.Invalidate(); } - if (makeUndoable) + if (makeUndoable && element.IsUndoable) { MakeUndoable(new AddElementMemento(this, element), false); } @@ -1790,11 +1953,17 @@ namespace Greenshot.Editor.Drawing public void RemoveElements(IDrawableContainerList elementsToRemove, bool makeUndoable = true) { // fix potential issues with iterating a changing list - DrawableContainerList cloned = new DrawableContainerList(); - cloned.AddRange(elementsToRemove); + DrawableContainerList cloned = new DrawableContainerList(elementsToRemove); + if (makeUndoable) { - MakeUndoable(new DeleteElementsMemento(this, cloned), false); + // Take all containers to make undoable + var undoableContainers = elementsToRemove.Where(c => c.IsUndoable).ToList(); + if (undoableContainers.Any()) + { + var undoableContainerList = new DrawableContainerList(undoableContainers); + MakeUndoable(new DeleteElementsMemento(this, undoableContainerList), false); + } } SuspendLayout(); @@ -1842,7 +2011,7 @@ namespace Greenshot.Editor.Drawing Invalidate(); } - if (makeUndoable) + if (makeUndoable && elementToRemove is { IsUndoable: true }) { MakeUndoable(new DeleteElementMemento(this, elementToRemove), false); } @@ -1858,11 +2027,16 @@ namespace Greenshot.Editor.Drawing public void AddElements(IDrawableContainerList elementsToAdd, bool makeUndoable = true) { // fix potential issues with iterating a changing list - DrawableContainerList cloned = new DrawableContainerList(); - cloned.AddRange(elementsToAdd); + DrawableContainerList cloned = new DrawableContainerList(elementsToAdd); if (makeUndoable) { - MakeUndoable(new AddElementsMemento(this, cloned), false); + // Take all containers to make undoable + var undoableContainers = elementsToAdd.Where(c => c.IsUndoable).ToList(); + if (undoableContainers.Any()) + { + var undoableContainerList = new DrawableContainerList(undoableContainers); + MakeUndoable(new AddElementsMemento(this, undoableContainerList), false); + } } SuspendLayout(); @@ -1879,23 +2053,27 @@ namespace Greenshot.Editor.Drawing /// /// Returns if this surface has selected elements /// - /// - public bool HasSelectedElements => (selectedElements != null && selectedElements.Count > 0); + /// bool + public bool HasSelectedElements => selectedElements is { Count: > 0 }; + + /// + /// Provides the selected elements + /// + public IDrawableContainerList SelectedElements => selectedElements; /// /// Remove all the selected elements /// public void RemoveSelectedElements() { - if (HasSelectedElements) + if (!HasSelectedElements) return; + + // As RemoveElement will remove the element from the selectedElements list we need to copy the element to another list. + RemoveElements(selectedElements); + if (_movingElementChanged != null) { - // As RemoveElement will remove the element from the selectedElements list we need to copy the element to another list. - RemoveElements(selectedElements); - if (_movingElementChanged != null) - { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); - _movingElementChanged(this, eventArgs); - } + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs(); + _movingElementChanged(this, eventArgs); } } @@ -1904,11 +2082,9 @@ namespace Greenshot.Editor.Drawing /// public void CutSelectedElements() { - if (HasSelectedElements) - { - ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); - RemoveSelectedElements(); - } + if (!HasSelectedElements) return; + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); + RemoveSelectedElements(); } /// @@ -1916,38 +2092,90 @@ namespace Greenshot.Editor.Drawing /// public void CopySelectedElements() { - if (HasSelectedElements) + if (!HasSelectedElements) return; + ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); + } + + /// + /// This method is called to confirm/cancel. + /// Called when pressing enter or using the "check" in the editor. + /// redirects to the specialized confirm/cancel method + /// + /// bool + public void Confirm(bool confirm) + { + if (DrawingMode == DrawingModes.Crop) { - ClipboardHelper.SetClipboardData(typeof(IDrawableContainerList), selectedElements); + ConfirmCrop(confirm); + } + else + { + ConfirmSelectedConfirmableElements(confirm); } } /// - /// This method is called to confirm/cancel "confirmable" elements, like the crop-container. + /// This method is called to confirm/cancel "confirmable" elements /// Called when pressing enter or using the "check" in the editor. + ///
+ /// For crop-container there is a dedicated method . ///
- /// + /// bool public void ConfirmSelectedConfirmableElements(bool confirm) { // create new collection so that we can iterate safely (selectedElements might change due with confirm/cancel) List selectedDCs = new List(selectedElements); - foreach (IDrawableContainer dc in selectedDCs) - { - if (dc.Equals(_cropContainer)) - { - DrawingMode = DrawingModes.None; - // No undo memento for the cropcontainer itself, only for the effect - RemoveElement(_cropContainer, false); - if (confirm) - { - ApplyCrop(_cropContainer.Bounds); - } - - _cropContainer.Dispose(); - _cropContainer = null; - break; - } + foreach (IDrawableContainer dc in selectedDCs.Where(c => c.IsConfirmable)) + { + throw new NotImplementedException($"No confirm/cancel defined for Container type {dc.GetType()}"); } + + // maybe the undo button has to be enabled + _movingElementChanged?.Invoke(this, new SurfaceElementEventArgs()); + } + + /// + /// This method is called to confirm/cancel the crop-container. + /// Called when pressing enter or using the "check" in the editor. + /// + /// bool + public void ConfirmCrop(bool confirm) + { + if (_cropContainer is not CropContainer e) return; + + if (confirm && selectedElements.Count > 0) + { + // No undo memento for the cropcontainer itself, only for the effect + RemoveElement(_cropContainer, false); + + _ = e.GetFieldValue(FieldType.CROPMODE) switch + { + CropContainer.CropModes.Horizontal => ApplyHorizontalCrop(_cropContainer.Bounds), + CropContainer.CropModes.Vertical => ApplyVerticalCrop(_cropContainer.Bounds), + _ => ApplyCrop(_cropContainer.Bounds) + }; + + _cropContainer.Dispose(); + _cropContainer = null; + } + else + { + RemoveCropContainer(); + } + + DrawingMode = DrawingModes.None; + + // maybe the undo button has to be enabled + _movingElementChanged?.Invoke(this, new SurfaceElementEventArgs()); + } + + public void RemoveCropContainer() + { + if (_cropContainer == null) return; + + RemoveElement(_cropContainer, false); + _cropContainer.Dispose(); + _cropContainer = null; } /// @@ -1980,34 +2208,33 @@ namespace Greenshot.Editor.Drawing // Make element(s) only move 10,10 if the surface is the same bool isSameSurface = (dcs.ParentID == _uniqueId); dcs.Parent = this; - var moveOffset = isSameSurface ? new Point(10, 10) : Point.Empty; + var moveOffset = isSameSurface ? new NativePoint(10, 10) : NativePoint.Empty; // Here a fix for bug #1475, first calculate the bounds of the complete IDrawableContainerList - Rectangle drawableContainerListBounds = Rectangle.Empty; + NativeRect drawableContainerListBounds = NativeRect.Empty; foreach (var element in dcs) { - drawableContainerListBounds = drawableContainerListBounds == Rectangle.Empty + drawableContainerListBounds = drawableContainerListBounds == NativeRect.Empty ? element.DrawingBounds - : Rectangle.Union(drawableContainerListBounds, element.DrawingBounds); + : drawableContainerListBounds.Union(element.DrawingBounds); } // And find a location inside the target surface to paste to bool containersCanFit = drawableContainerListBounds.Width < Bounds.Width && drawableContainerListBounds.Height < Bounds.Height; if (!containersCanFit) { - Point containersLocation = drawableContainerListBounds.Location; + NativePoint containersLocation = drawableContainerListBounds.Location; containersLocation.Offset(moveOffset); if (!Bounds.Contains(containersLocation)) { // Easy fix for same surface moveOffset = isSameSurface - ? new Point(-10, -10) - : new Point(-drawableContainerListBounds.Location.X + 10, -drawableContainerListBounds.Location.Y + 10); + ? new NativePoint(-10, -10) + : new NativePoint(-drawableContainerListBounds.Location.X + 10, -drawableContainerListBounds.Location.Y + 10); } } else { - Rectangle moveContainerListBounds = drawableContainerListBounds; - moveContainerListBounds.Offset(moveOffset); + NativeRect moveContainerListBounds = drawableContainerListBounds.Offset(moveOffset); // check if the element is inside if (!Bounds.Contains(moveContainerListBounds)) { @@ -2055,24 +2282,22 @@ namespace Greenshot.Editor.Drawing } else if (ClipboardHelper.ContainsImage(clipboard)) { - Point pasteLocation = GetPasteLocation(0.1f, 0.1f); + NativePoint pasteLocation = GetPasteLocation(0.1f, 0.1f); - foreach (Image clipboardImage in ClipboardHelper.GetImages(clipboard)) + foreach (var drawableContainer in ClipboardHelper.GetDrawables(clipboard)) { - if (clipboardImage != null) - { - DeselectAllElements(); - IImageContainer container = AddImageContainer(clipboardImage as Bitmap, pasteLocation.X, pasteLocation.Y); - SelectElement(container); - clipboardImage.Dispose(); - pasteLocation.X += 10; - pasteLocation.Y += 10; - } + if (drawableContainer == null) continue; + DeselectAllElements(); + drawableContainer.Left = pasteLocation.X; + drawableContainer.Top = pasteLocation.Y; + AddElement(drawableContainer); + SelectElement(drawableContainer); + pasteLocation = pasteLocation.Offset(10, 10); } } else if (ClipboardHelper.ContainsText(clipboard)) { - Point pasteLocation = GetPasteLocation(0.4f, 0.4f); + NativePoint pasteLocation = GetPasteLocation(0.4f, 0.4f); string text = ClipboardHelper.GetText(clipboard); if (text != null) @@ -2092,13 +2317,13 @@ namespace Greenshot.Editor.Drawing /// /// 0.0f for the left edge of visible area, 1.0f for the right edge of visible area. /// 0.0f for the top edge of visible area, 1.0f for the bottom edge of visible area. - private Point GetPasteLocation(float horizontalRatio = 0.5f, float verticalRatio = 0.5f) + private NativePoint GetPasteLocation(float horizontalRatio = 0.5f, float verticalRatio = 0.5f) { var point = PointToClient(MousePosition); var rc = GetVisibleRectangle(); if (!rc.Contains(point)) { - point = new Point( + point = new NativePoint( rc.Left + (int) (rc.Width * horizontalRatio), rc.Top + (int) (rc.Height * verticalRatio) ); @@ -2110,11 +2335,11 @@ namespace Greenshot.Editor.Drawing /// /// Get the rectangle bounding the part of this Surface currently visible in the editor (in surface coordinate space). /// - public Rectangle GetVisibleRectangle() + public NativeRect GetVisibleRectangle() { var bounds = Bounds; var clientArea = Parent.ClientRectangle; - return new Rectangle( + return new NativeRect( Math.Max(0, -bounds.Left), Math.Max(0, -bounds.Top), clientArea.Width, @@ -2124,13 +2349,13 @@ namespace Greenshot.Editor.Drawing /// /// Get the rectangle bounding all selected elements (in surface coordinates space), - /// or empty rectangle if nothing is selcted. + /// or empty rectangle if nothing is selected. /// - public Rectangle GetSelectionRectangle() + public NativeRect GetSelectionRectangle() => ToSurfaceCoordinates(selectedElements.DrawingBounds); /// - /// Duplicate all the selecteded elements + /// Duplicate all the selected elements /// public void DuplicateSelectedElements() { @@ -2208,24 +2433,23 @@ namespace Greenshot.Editor.Drawing /// false to skip event generation public void SelectElement(IDrawableContainer container, bool invalidate = true, bool generateEvents = true) { - if (!selectedElements.Contains(container)) - { - selectedElements.Add(container); - container.Selected = true; - FieldAggregator.BindElement(container); - if (generateEvents && _movingElementChanged != null) - { - SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs - { - Elements = selectedElements - }; - _movingElementChanged(this, eventArgs); - } + if (selectedElements.Contains(container)) return; - if (invalidate) + selectedElements.Add(container); + container.Selected = true; + FieldAggregator.BindElement(container); + if (generateEvents && _movingElementChanged != null) + { + SurfaceElementEventArgs eventArgs = new SurfaceElementEventArgs { - container.Invalidate(); - } + Elements = selectedElements + }; + _movingElementChanged(this, eventArgs); + } + + if (invalidate) + { + container.Invalidate(); } } @@ -2270,28 +2494,28 @@ namespace Greenshot.Editor.Drawing /// false if no keys were processed public bool ProcessCmdKey(Keys k) { - if (selectedElements.Count <= 0) return false; + if (selectedElements.Count <= 0 && k != Keys.Escape) return false; bool shiftModifier = (ModifierKeys & Keys.Shift) == Keys.Shift; int px = shiftModifier ? 10 : 1; - Point moveBy = Point.Empty; + NativePoint moveBy = NativePoint.Empty; switch (k) { case Keys.Left: case Keys.Left | Keys.Shift: - moveBy = new Point(-px, 0); + moveBy = new NativePoint(-px, 0); break; case Keys.Up: case Keys.Up | Keys.Shift: - moveBy = new Point(0, -px); + moveBy = new NativePoint(0, -px); break; case Keys.Right: case Keys.Right | Keys.Shift: - moveBy = new Point(px, 0); + moveBy = new NativePoint(px, 0); break; case Keys.Down: case Keys.Down | Keys.Shift: - moveBy = new Point(0, px); + moveBy = new NativePoint(0, px); break; case Keys.PageUp: PullElementsUp(); @@ -2306,10 +2530,10 @@ namespace Greenshot.Editor.Drawing PushElementsToBottom(); break; case Keys.Enter: - ConfirmSelectedConfirmableElements(true); + Confirm(true); break; case Keys.Escape: - ConfirmSelectedConfirmableElements(false); + Confirm(false); break; case Keys.D0 | Keys.Control: case Keys.D0 | Keys.Shift | Keys.Control: @@ -2369,7 +2593,7 @@ namespace Greenshot.Editor.Drawing return false; } - if (!Point.Empty.Equals(moveBy)) + if (moveBy != NativePoint.Empty) { selectedElements.MakeBoundsChangeUndoable(true); selectedElements.MoveBy(moveBy.X, moveBy.Y); @@ -2468,7 +2692,7 @@ namespace Greenshot.Editor.Drawing return _elements.CanPushDown(selectedElements); } - public void Element_FieldChanged(object sender, FieldChangedEventArgs e) + private void Element_FieldChanged(object sender, FieldChangedEventArgs e) { selectedElements.HandleFieldChangedEvent(sender, e); } @@ -2478,7 +2702,7 @@ namespace Greenshot.Editor.Drawing return _elements.Contains(container); } - public Point ToSurfaceCoordinates(Point point) + public NativePoint ToSurfaceCoordinates(NativePoint point) { Point[] points = { @@ -2488,29 +2712,27 @@ namespace Greenshot.Editor.Drawing return points[0]; } - public Rectangle ToSurfaceCoordinates(Rectangle rc) + public NativeRect ToSurfaceCoordinates(NativeRect rc) { if (_zoomMatrix.IsIdentity) { return rc; } - else + + Point[] points = { - Point[] points = - { - rc.Location, rc.Location + rc.Size - }; - _zoomMatrix.TransformPoints(points); - return new Rectangle( - points[0].X, - points[0].Y, - points[1].X - points[0].X, - points[1].Y - points[0].Y - ); - } + rc.Location, rc.Location.Offset(rc.Size.Width, rc.Size.Height) + }; + _zoomMatrix.TransformPoints(points); + return new NativeRect( + points[0].X, + points[0].Y, + points[1].X - points[0].X, + points[1].Y - points[0].Y + ); } - public Point ToImageCoordinates(Point point) + public NativePoint ToImageCoordinates(NativePoint point) { Point[] points = { @@ -2520,26 +2742,24 @@ namespace Greenshot.Editor.Drawing return points[0]; } - public Rectangle ToImageCoordinates(Rectangle rc) + public NativeRect ToImageCoordinates(NativeRect rc) { if (_inverseZoomMatrix.IsIdentity) { return rc; } - else + + Point[] points = { - Point[] points = - { - rc.Location, rc.Location + rc.Size - }; - _inverseZoomMatrix.TransformPoints(points); - return new Rectangle( - points[0].X, - points[0].Y, - points[1].X - points[0].X, - points[1].Y - points[0].Y - ); - } + rc.Location, rc.Location.Offset(rc.Size.Width, rc.Size.Height) + }; + _inverseZoomMatrix.TransformPoints(points); + return new NativeRect( + points[0].X, + points[0].Y, + points[1].X - points[0].X, + points[1].Y - points[0].Y + ); } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/SvgContainer.cs b/src/Greenshot.Editor/Drawing/SvgContainer.cs new file mode 100644 index 000000000..85b8cb43d --- /dev/null +++ b/src/Greenshot.Editor/Drawing/SvgContainer.cs @@ -0,0 +1,81 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Drawing; +using System.IO; +using Dapplo.Windows.Common.Structs; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Svg; + +namespace Greenshot.Editor.Drawing +{ + /// + /// This provides a resizable SVG container, redrawing the SVG in the size the container takes. + /// + [Serializable] + public class SvgContainer : VectorGraphicsContainer + { + private MemoryStream _svgContent; + + [NonSerialized] + private SvgDocument _svgDocument; + + public SvgContainer(Stream stream, ISurface parent) : base(parent) + { + _svgContent = new MemoryStream(); + stream.CopyTo(_svgContent); + Init(); + Size = new Size((int)_svgDocument.Width, (int)_svgDocument.Height); + } + + protected override void Init() + { + base.Init(); + // Do nothing when there is no content + if (_svgContent == null) + { + return; + } + _svgContent.Position = 0; + + _svgDocument = SvgDocument.Open(_svgContent); + } + + protected override Image ComputeBitmap() + { + //var image = ImageHelper.CreateEmpty(Width, Height, PixelFormat.Format32bppArgb, Color.Transparent); + + var image = _svgDocument.Draw(Width, Height); + + if (RotationAngle == 0) return image; + + var newImage = image.Rotate(RotationAngle); + image.Dispose(); + return newImage; + } + + public override bool HasDefaultSize => true; + + public override NativeSize DefaultSize => new NativeSize((int)_svgDocument.Width, (int)_svgDocument.Height); + } +} \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/TextContainer.cs b/src/Greenshot.Editor/Drawing/TextContainer.cs index 4d670b4e0..a49fd4bee 100644 --- a/src/Greenshot.Editor/Drawing/TextContainer.cs +++ b/src/Greenshot.Editor/Drawing/TextContainer.cs @@ -27,10 +27,12 @@ using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Runtime.Serialization; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Editor.Drawing.Fields; -using Greenshot.Editor.Helpers; using Greenshot.Editor.Memento; namespace Greenshot.Editor.Drawing @@ -73,7 +75,7 @@ namespace Greenshot.Editor.Drawing { if ((text != null || newText == null) && string.Equals(text, newText)) return; - if (makeUndoable && allowUndoable) + if (makeUndoable && allowUndoable && IsUndoable) { makeUndoable = false; _parent.MakeUndoable(new TextChangeMemento(this), false); @@ -83,7 +85,7 @@ namespace Greenshot.Editor.Drawing OnPropertyChanged("Text"); } - public TextContainer(Surface parent) : base(parent) + public TextContainer(ISurface parent) : base(parent) { Init(); } @@ -154,17 +156,17 @@ namespace Greenshot.Editor.Drawing FieldChanged += TextContainer_FieldChanged; } - protected override void SwitchParent(Surface newParent) + protected override void SwitchParent(ISurface newParent) { - if (_parent != null) + if (InternalParent != null) { - _parent.SizeChanged -= Parent_SizeChanged; + InternalParent.SizeChanged -= Parent_SizeChanged; } base.SwitchParent(newParent); - if (_parent != null) + if (InternalParent != null) { - _parent.SizeChanged += Parent_SizeChanged; + InternalParent.SizeChanged += Parent_SizeChanged; } } @@ -174,7 +176,7 @@ namespace Greenshot.Editor.Drawing UpdateTextBoxFont(); } - public override void ApplyBounds(RectangleF newBounds) + public override void ApplyBounds(NativeRectFloat newBounds) { base.ApplyBounds(newBounds); UpdateTextBoxPosition(); @@ -221,10 +223,10 @@ namespace Greenshot.Editor.Drawing { ShowTextBox(); } - else if (_parent != null && Selected && Status == EditStatus.IDLE && _textBox.Visible) + else if (InternalParent != null && Selected && Status == EditStatus.IDLE && _textBox.Visible) { // Fix (workaround) for BUG-1698 - _parent.KeysLocked = true; + InternalParent.KeysLocked = true; } } @@ -289,16 +291,16 @@ namespace Greenshot.Editor.Drawing }; _textBox.DataBindings.Add("Text", this, "Text", false, DataSourceUpdateMode.OnPropertyChanged); - _textBox.LostFocus += textBox_LostFocus; + _textBox.LostFocus += TextBox_LostFocus; _textBox.KeyDown += textBox_KeyDown; } private void ShowTextBox() { - if (_parent != null) + if (InternalParent != null) { - _parent.KeysLocked = true; - _parent.Controls.Add(_textBox); + InternalParent.KeysLocked = true; + InternalParent.Controls.Add(_textBox); } EnsureTextBoxContrast(); @@ -332,15 +334,18 @@ namespace Greenshot.Editor.Drawing private void HideTextBox() { - _parent?.Focus(); + InternalParent?.Focus(); _textBox?.Hide(); - if (_parent == null) + if (InternalParent == null) { return; } - _parent.KeysLocked = false; - _parent.Controls.Remove(_textBox); + InternalParent.KeysLocked = false; + if (_textBox != null) + { + InternalParent.Controls.Remove(_textBox); + } } /// @@ -349,12 +354,12 @@ namespace Greenshot.Editor.Drawing /// public override void Transform(Matrix matrix) { - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); int pixelsBefore = rect.Width * rect.Height; // Transform this container base.Transform(matrix); - rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + rect = new NativeRect(Left, Top, Width, Height).Normalize(); int pixelsAfter = rect.Width * rect.Height; float factor = pixelsAfter / (float) pixelsBefore; @@ -504,8 +509,8 @@ namespace Greenshot.Editor.Drawing correction = -1; } - Rectangle absRectangle = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - Rectangle displayRectangle = Parent.ToSurfaceCoordinates(absRectangle); + var absRectangle = new NativeRect(Left, Top, Width, Height).Normalize(); + var displayRectangle = Parent.ToSurfaceCoordinates(absRectangle); _textBox.Left = displayRectangle.X + lineWidth; _textBox.Top = displayRectangle.Y + lineWidth; if (lineThickness <= 1) @@ -580,7 +585,7 @@ namespace Greenshot.Editor.Drawing } } - private void textBox_LostFocus(object sender, EventArgs e) + private void TextBox_LostFocus(object sender, EventArgs e) { // next change will be made undoable makeUndoable = true; @@ -597,7 +602,7 @@ namespace Greenshot.Editor.Drawing graphics.PixelOffsetMode = PixelOffsetMode.None; graphics.TextRenderingHint = TextRenderingHint.SystemDefault; - Rectangle rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); + var rect = new NativeRect(Left, Top, Width, Height).Normalize(); if (Selected && rm == RenderMode.EDIT) { DrawSelectionBorder(graphics, rect); @@ -629,7 +634,7 @@ namespace Greenshot.Editor.Drawing /// /// /// - public static void DrawText(Graphics graphics, Rectangle drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, + public static void DrawText(Graphics graphics, NativeRect drawingRectange, int lineThickness, Color fontColor, bool drawShadow, StringFormat stringFormat, string text, Font font) { #if DEBUG @@ -651,10 +656,10 @@ namespace Greenshot.Editor.Drawing while (currentStep <= steps) { int offset = currentStep; - Rectangle shadowRect = GuiRectangle.GetGuiRectangle(drawingRectange.Left + offset, drawingRectange.Top + offset, drawingRectange.Width, drawingRectange.Height); + NativeRect shadowRect = new NativeRect(drawingRectange.Left + offset, drawingRectange.Top + offset, drawingRectange.Width, drawingRectange.Height).Normalize(); if (lineThickness > 0) { - shadowRect.Inflate(-textOffset, -textOffset); + shadowRect = shadowRect.Inflate(-textOffset, -textOffset); } using Brush fontBrush = new SolidBrush(Color.FromArgb(alpha, 100, 100, 100)); graphics.DrawString(text, font, fontBrush, shadowRect, stringFormat); @@ -666,7 +671,7 @@ namespace Greenshot.Editor.Drawing if (lineThickness > 0) { - drawingRectange.Inflate(-textOffset, -textOffset); + drawingRectange = drawingRectange.Inflate(-textOffset, -textOffset); } using (Brush fontBrush = new SolidBrush(fontColor)) { @@ -683,8 +688,7 @@ namespace Greenshot.Editor.Drawing public override bool ClickableAt(int x, int y) { - Rectangle r = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height); - r.Inflate(5, 5); + var r = new NativeRect(Left, Top, Width, Height).Normalize().Inflate(5, 5); return r.Contains(x, y); } } diff --git a/src/Greenshot.Editor/Drawing/VectorGraphicsContainer.cs b/src/Greenshot.Editor/Drawing/VectorGraphicsContainer.cs new file mode 100644 index 000000000..43da94c7d --- /dev/null +++ b/src/Greenshot.Editor/Drawing/VectorGraphicsContainer.cs @@ -0,0 +1,155 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Runtime.Serialization; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Editor.Drawing.Adorners; + +namespace Greenshot.Editor.Drawing +{ + /// + /// This is the base container for vector graphics, these ae graphics which can resize without loss of quality. + /// Examples for this are SVG, WMF or EMF, but also graphics based on fonts (e.g. Emoji) + /// + [Serializable] + public abstract class VectorGraphicsContainer : DrawableContainer + { + private int _rotationAngle; + protected int RotationAngle + { + get => _rotationAngle; + set => _rotationAngle = value; + } + + /// + /// This is the cached version of the bitmap, pre-rendered to save performance + /// Do not serialized, it can be rebuild with other information. + /// + [NonSerialized] + private Image _cachedImage; + + /// + /// Constructor takes care of calling Init + /// + /// ISurface + public VectorGraphicsContainer(ISurface parent) : base(parent) + { + Init(); + } + + /// + /// Make sure Init is called after deserializing + /// + /// StreamingContext + protected override void OnDeserialized(StreamingContext streamingContext) + { + base.OnDeserialized(streamingContext); + Init(); + } + + /// + /// Init is called after creating the instance, and from OnDeserialized + /// This is the place to generate your adorners + /// + protected virtual void Init() + { + // Check if the adorners are already defined! + if (Adorners.Count > 0) + { + return; + } + + Adorners.Add(new ResizeAdorner(this, Positions.TopLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.TopRight)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomLeft)); + Adorners.Add(new ResizeAdorner(this, Positions.BottomRight)); + } + + /// + /// The bulk of the clean-up code is implemented in Dispose(bool) + /// This Dispose is called from the Dispose and the Destructor. + /// When disposing==true all non-managed resources should be freed too! + /// + /// + + protected override void Dispose(bool disposing) + { + if (disposing) + { + ResetCachedBitmap(); + } + + base.Dispose(disposing); + } + + /// + public override void Transform(Matrix matrix) + { + RotationAngle += CalculateAngle(matrix); + RotationAngle %= 360; + + ResetCachedBitmap(); + + base.Transform(matrix); + } + + /// + public override void Draw(Graphics graphics, RenderMode rm) + { + if (_cachedImage != null && _cachedImage.Size != Bounds.Size) + { + ResetCachedBitmap(); + } + + _cachedImage ??= ComputeBitmap(); + if (_cachedImage == null) + { + return; + } + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + + graphics.DrawImage(_cachedImage, Bounds); + } + + /// + /// Implement this to compute the new bitmap according to the size of the container + /// + /// Image + protected abstract Image ComputeBitmap(); + + /// + /// Dispose of the cached bitmap, forcing the code to regenerate it + /// + protected void ResetCachedBitmap() + { + _cachedImage?.Dispose(); + _cachedImage = null; + } + } +} \ No newline at end of file diff --git a/src/Greenshot.Editor/Helpers/GuiRectangle.cs b/src/Greenshot.Editor/EditorInitialize.cs similarity index 50% rename from src/Greenshot.Editor/Helpers/GuiRectangle.cs rename to src/Greenshot.Editor/EditorInitialize.cs index d5855afb5..c1ee27db8 100644 --- a/src/Greenshot.Editor/Helpers/GuiRectangle.cs +++ b/src/Greenshot.Editor/EditorInitialize.cs @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * @@ -19,35 +19,32 @@ * along with this program. If not, see . */ -using System.Drawing; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Editor.FileFormatHandlers; -namespace Greenshot.Editor.Helpers +namespace Greenshot.Editor { - /// - /// Helper class for creating rectangles with positive dimensions, regardless of input coordinates - /// - public static class GuiRectangle + public static class EditorInitialize { - public static Rectangle GetGuiRectangle(int x, int y, int w, int h) + public static void Initialize() { - var rect = new Rectangle(x, y, w, h); - MakeGuiRectangle(ref rect); - return rect; - } - - public static void MakeGuiRectangle(ref Rectangle rect) - { - if (rect.Width < 0) - { - rect.X += rect.Width; - rect.Width = -rect.Width; - } - - if (rect.Height < 0) - { - rect.Y += rect.Height; - rect.Height = -rect.Height; - } + SimpleServiceProvider.Current.AddService( + // All generic things, like gif, png, jpg etc. + new DefaultFileFormatHandler(), + // Greenshot format + new GreenshotFileFormatHandler(), + // For .svg support + new SvgFileFormatHandler(), + // For clipboard support + new DibFileFormatHandler(), + // .ico + new IconFileFormatHandler(), + // EMF & WMF + new MetaFileFormatHandler(), + // JPG XR + new WpfFileFormatHandler() + ); } } -} \ No newline at end of file +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/AbstractFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/AbstractFileFormatHandler.cs new file mode 100644 index 000000000..fff576267 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/AbstractFileFormatHandler.cs @@ -0,0 +1,66 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Base.Interfaces.Plugin; +using Greenshot.Editor.Drawing; + +namespace Greenshot.Editor.FileFormatHandlers +{ + public abstract class AbstractFileFormatHandler : IFileFormatHandler + { + /// + public IDictionary> SupportedExtensions { get; } = new Dictionary>(); + + /// + public virtual int PriorityFor(FileFormatHandlerActions fileFormatHandlerAction, string extension) + { + return 0; + } + + public abstract bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null); + + public abstract bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap); + + /// + /// Default implementation taking the TryLoadFromStream image and placing it in an ImageContainer + /// + /// Stream + /// string + /// ISurface + /// IEnumerable{IDrawableContainer} + public virtual IEnumerable LoadDrawablesFromStream(Stream stream, string extension, ISurface parent = null) + { + if (TryLoadFromStream(stream, extension, out var bitmap)) + { + var imageContainer = new ImageContainer(parent) + { + Image = bitmap + }; + yield return imageContainer; + } + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/DefaultFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/DefaultFileFormatHandler.cs new file mode 100644 index 000000000..115b5328f --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/DefaultFileFormatHandler.cs @@ -0,0 +1,137 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Plugin; +using log4net; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// This is the default .NET bitmap file format handler + /// + public class DefaultFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private static readonly ILog Log = LogManager.GetLogger(typeof(DefaultFileFormatHandler)); + private readonly IReadOnlyCollection _ourExtensions = new[] { ".png", ".bmp", ".gif", ".jpg", ".jpeg", ".tiff", ".tif" }; + public DefaultFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.SaveToStream] = _ourExtensions; + } + + /// + public override bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + ImageFormat imageFormat = extension switch + { + ".png" => ImageFormat.Png, + ".bmp" => ImageFormat.Bmp, + ".gif" => ImageFormat.Gif, + ".jpg" => ImageFormat.Jpeg, + ".jpeg" => ImageFormat.Jpeg, + ".tiff" => ImageFormat.Tiff, + ".tif" => ImageFormat.Tiff, + _ => null + }; + + if (imageFormat == null) + { + return false; + } + surfaceOutputSettings ??= new SurfaceOutputSettings(); + var imageEncoder = ImageCodecInfo.GetImageEncoders().FirstOrDefault(ie => ie.FilenameExtension.ToLowerInvariant().Contains(extension)); + if (imageEncoder == null) + { + return false; + } + EncoderParameters parameters = new EncoderParameters(1) + { + Param = + { + [0] = new EncoderParameter(Encoder.Quality, surfaceOutputSettings.JPGQuality) + } + }; + // For those images which are with Alpha, but the format doesn't support this, change it to 24bpp + if (imageFormat.Guid == ImageFormat.Jpeg.Guid && Image.IsAlphaPixelFormat(bitmap.PixelFormat)) + { + var nonAlphaImage = ImageHelper.Clone(bitmap, PixelFormat.Format24bppRgb); + try + { + // Set that this file was written by Greenshot + nonAlphaImage.AddTag(); + } + catch (Exception ex) + { + Log.Warn("Couldn't set 'software used' tag on image.", ex); + } + + try + { + nonAlphaImage.Save(destination, imageEncoder, parameters); + } + catch (Exception ex) + { + Log.Error("Couldn't save image: ", ex); + } + finally + { + nonAlphaImage.Dispose(); + } + } + else + { + // Set that this file was written by Greenshot + bitmap.AddTag(); + bitmap.Save(destination, imageEncoder, parameters); + } + + return true; + } + + /// + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + try + { + using var tmpImage = Image.FromStream(stream, true, true); + bitmap = ImageHelper.Clone(tmpImage, PixelFormat.DontCare); + + return true; + } + catch (Exception ex) + { + Log.Error("Couldn't load image: ", ex); + } + + bitmap = null; + return false; + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/DibFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/DibFileFormatHandler.cs new file mode 100644 index 000000000..b14a33bd0 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/DibFileFormatHandler.cs @@ -0,0 +1,216 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32.Enums; +using Dapplo.Windows.Gdi32.Structs; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Plugin; +using log4net; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// This handles creating a DIB (Device Independent Bitmap) on the clipboard + /// + public class DibFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private const double DpiToPelsPerMeter = 39.3701; + private static readonly ILog Log = LogManager.GetLogger(typeof(DibFileFormatHandler)); + + private readonly IReadOnlyCollection _ourExtensions = new[] { ".dib", ".format17", ".deviceindependentbitmap" }; + + public DibFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.SaveToStream] = _ourExtensions; + } + + /// + public override bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + var dibBytes = ConvertToDib(bitmap); + destination.Write(dibBytes, 0, dibBytes.Length); + return true; + } + + /// + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + byte[] dibBuffer = new byte[stream.Length]; + _ = stream.Read(dibBuffer, 0, dibBuffer.Length); + var infoHeader = BinaryStructHelper.FromByteArray(dibBuffer); + if (!infoHeader.IsDibV5) + { + Log.InfoFormat("Using special DIB + /// Converts the Bitmap to a Device Independent Bitmap format of type BITFIELDS. + /// + /// Bitmap to convert to DIB + /// byte{} with the image converted to DIB + private static byte[] ConvertToDib(Bitmap sourceBitmap) + { + if (sourceBitmap == null) throw new ArgumentNullException(nameof(sourceBitmap)); + + var area = new NativeRect(0, 0, sourceBitmap.Width, sourceBitmap.Height); + + // If the supplied format doesn't match 32bpp, we need to convert it first, and dispose the new bitmap afterwards + bool needsDisposal = false; + if (sourceBitmap.PixelFormat != PixelFormat.Format32bppArgb) + { + needsDisposal = true; + var clonedImage = ImageHelper.CreateEmptyLike(sourceBitmap, Color.Transparent, PixelFormat.Format32bppArgb); + using (var graphics = Graphics.FromImage(clonedImage)) + { + graphics.DrawImage(sourceBitmap, area); + } + sourceBitmap = clonedImage; + } + + // All the pixels take this many bytes: + var bitmapSize = 4 * sourceBitmap.Width * sourceBitmap.Height; + // The bitmap info hear takes this many bytes: + var bitmapInfoHeaderSize = Marshal.SizeOf(typeof(BitmapInfoHeader)); + // The bitmap info size is the header + 3 RGBQUADs + var bitmapInfoSize = bitmapInfoHeaderSize + 3 * Marshal.SizeOf(typeof(RgbQuad)); + + // Create a byte [] to contain the complete DIB (with .NET 5 and upwards, we could write the pixels directly to a stream) + var fullBmpBytes = new byte[bitmapInfoSize + bitmapSize]; + // Get a span for this, this simplifies the code a bit + var fullBmpSpan = fullBmpBytes.AsSpan(); + // Cast the span to be of type BITMAPINFOHEADER so we can assign values + // TODO: in .NET 6 we could do a AsRef, and even write to a stream directly + var bitmapInfoHeader = MemoryMarshal.Cast(fullBmpSpan); + + // Fill up the bitmap info header + bitmapInfoHeader[0].Size = (uint)bitmapInfoHeaderSize; + bitmapInfoHeader[0].Width = sourceBitmap.Width; + bitmapInfoHeader[0].Height = sourceBitmap.Height; + bitmapInfoHeader[0].Planes = 1; + bitmapInfoHeader[0].BitCount = 32; + bitmapInfoHeader[0].Compression = BitmapCompressionMethods.BI_BITFIELDS; + bitmapInfoHeader[0].SizeImage = (uint)bitmapSize; + bitmapInfoHeader[0].XPelsPerMeter = (int)(sourceBitmap.HorizontalResolution * DpiToPelsPerMeter); + bitmapInfoHeader[0].YPelsPerMeter = (int)(sourceBitmap.VerticalResolution * DpiToPelsPerMeter); + + // Specify the color masks applied to the Int32 pixel value to get the R, G and B values. + var rgbQuads = MemoryMarshal.Cast(fullBmpSpan.Slice(Marshal.SizeOf(typeof(BitmapInfoHeader)))); + rgbQuads[0].Red = 255; + rgbQuads[1].Green = 255; + rgbQuads[2].Blue = 255; + + // Now copy the lines, in reverse (bmp is upside down) to the byte array + var sourceBitmapData = sourceBitmap.LockBits(area, ImageLockMode.ReadOnly, sourceBitmap.PixelFormat); + try + { + // Get a span for the real bitmap bytes, which starts after the bitmapinfo (header + 3xRGBQuad) + var bitmapSpan = fullBmpSpan.Slice(bitmapInfoSize); + // Make sure we also have a span to copy from, by taking the pointer from the locked bitmap + Span bitmapSourceSpan; + unsafe + { + bitmapSourceSpan = new Span(sourceBitmapData.Scan0.ToPointer(), sourceBitmapData.Stride * sourceBitmapData.Height); + } + + // Loop over all the bitmap lines + for (int destinationY = 0; destinationY < sourceBitmap.Height; destinationY++) + { + // Calculate the y coordinate for the bottom up. (flipping the image) + var sourceY = (sourceBitmap.Height - 1) - destinationY; + // Make a Span for the source bitmap pixels + var sourceLine = bitmapSourceSpan.Slice(sourceBitmapData.Stride * sourceY, 4 * sourceBitmap.Width); + // Make a Span for the destination dib pixels + var destinationLine = bitmapSpan.Slice(destinationY * 4 * sourceBitmap.Width); + sourceLine.CopyTo(destinationLine); + } + } + finally + { + sourceBitmap.UnlockBits(sourceBitmapData); + } + + // If we created a new bitmap, we need to dispose this + if (needsDisposal) + { + sourceBitmap.Dispose(); + } + return fullBmpBytes; + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/GreenshotFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/GreenshotFileFormatHandler.cs new file mode 100644 index 000000000..0b956c001 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/GreenshotFileFormatHandler.cs @@ -0,0 +1,133 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Reflection; +using System.Text; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Plugin; +using log4net; + +namespace Greenshot.Editor.FileFormatHandlers +{ + public class GreenshotFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private static readonly ILog Log = LogManager.GetLogger(typeof(GreenshotFileFormatHandler)); + private readonly IReadOnlyCollection _ourExtensions = new [] { ".greenshot" }; + public GreenshotFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.SaveToStream] = _ourExtensions; + } + + public override bool TrySaveToStream(Bitmap bitmap, Stream stream, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + if (surface == null) + { + return false; + } + + try + { + bitmap.Save(stream, ImageFormat.Png); + using MemoryStream tmpStream = new MemoryStream(); + long bytesWritten = surface.SaveElementsToStream(tmpStream); + using BinaryWriter writer = new BinaryWriter(tmpStream); + writer.Write(bytesWritten); + Version v = Assembly.GetExecutingAssembly().GetName().Version; + byte[] marker = Encoding.ASCII.GetBytes($"Greenshot{v.Major:00}.{v.Minor:00}"); + writer.Write(marker); + tmpStream.WriteTo(stream); + return true; + } + catch (Exception ex) + { + Log.Error("Couldn't save surface as .greenshot: ", ex); + } + + return false; + } + + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + try + { + var surface = LoadSurface(stream); + bitmap = (Bitmap)surface.GetImageForExport(); + return true; + } + catch (Exception ex) + { + Log.Error("Couldn't load .greenshot: ", ex); + } + bitmap = null; + return false; + } + + private ISurface LoadSurface(Stream surfaceFileStream) + { + var returnSurface = SimpleServiceProvider.Current.GetInstance>().Invoke(); + Bitmap captureBitmap; + + // Fixed problem that the bitmap stream is disposed... by Cloning the image + // This also ensures the bitmap is correctly created + using (Image tmpImage = Image.FromStream(surfaceFileStream, true, true)) + { + Log.DebugFormat("Loaded capture from .greenshot file with Size {0}x{1} and PixelFormat {2}", tmpImage.Width, tmpImage.Height, tmpImage.PixelFormat); + captureBitmap = ImageHelper.Clone(tmpImage) as Bitmap; + } + + // Start at -14 read "GreenshotXX.YY" (XX=Major, YY=Minor) + const int markerSize = 14; + surfaceFileStream.Seek(-markerSize, SeekOrigin.End); + using (var streamReader = new StreamReader(surfaceFileStream)) + { + var greenshotMarker = streamReader.ReadToEnd(); + if (!greenshotMarker.StartsWith("Greenshot")) + { + throw new ArgumentException("Stream is not a Greenshot file!"); + } + + Log.InfoFormat("Greenshot file format: {0}", greenshotMarker); + const int fileSizeLocation = 8 + markerSize; + surfaceFileStream.Seek(-fileSizeLocation, SeekOrigin.End); + using BinaryReader reader = new BinaryReader(surfaceFileStream); + long bytesWritten = reader.ReadInt64(); + surfaceFileStream.Seek(-(bytesWritten + fileSizeLocation), SeekOrigin.End); + returnSurface.LoadElementsFromStream(surfaceFileStream); + } + + if (captureBitmap != null) + { + returnSurface.Image = captureBitmap; + Log.InfoFormat("Information about .greenshot file: {0}x{1}-{2} Resolution {3}x{4}", captureBitmap.Width, captureBitmap.Height, captureBitmap.PixelFormat, captureBitmap.HorizontalResolution, captureBitmap.VerticalResolution); + } + + return returnSurface; + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/IconFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/IconFileFormatHandler.cs new file mode 100644 index 000000000..d2769d5f0 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/IconFileFormatHandler.cs @@ -0,0 +1,218 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Plugin; +using log4net; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// THis is the .ico format handler + /// + public class IconFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private static readonly ILog Log = LogManager.GetLogger(typeof(IconFileFormatHandler)); + + private readonly IReadOnlyCollection _ourExtensions = new[] { ".ico" }; + + public IconFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.SaveToStream] = _ourExtensions; + } + + public override bool TrySaveToStream(Bitmap bitmap, Stream stream, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + IList images = new List + { + bitmap + }; + + var binaryWriter = new BinaryWriter(stream); + // + // ICONDIR structure + // + binaryWriter.Write((short)0); // reserved + binaryWriter.Write((short)1); // image type (icon) + binaryWriter.Write((short)images.Count); // number of images + + IList imageSizes = new List(); + IList encodedImages = new List(); + foreach (var image in images) + { + // Pick the best fit + var sizes = new[] + { + 16, 32, 48 + }; + int size = 256; + foreach (var possibleSize in sizes) + { + if (image.Width <= possibleSize && image.Height <= possibleSize) + { + size = possibleSize; + break; + } + } + + var imageStream = new MemoryStream(); + if (image.Width == size && image.Height == size) + { + using var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + clonedImage.Save(imageStream, ImageFormat.Png); + imageSizes.Add(new Size(size, size)); + } + else + { + // Resize to the specified size, first make sure the image is 32bpp + using var clonedImage = ImageHelper.Clone(image, PixelFormat.Format32bppArgb); + using var resizedImage = ImageHelper.ResizeImage(clonedImage, true, true, Color.Empty, size, size, null); + resizedImage.Save(imageStream, ImageFormat.Png); + imageSizes.Add(resizedImage.Size); + } + + imageStream.Seek(0, SeekOrigin.Begin); + encodedImages.Add(imageStream); + } + + // + // ICONDIRENTRY structure + // + const int iconDirSize = 6; + const int iconDirEntrySize = 16; + + var offset = iconDirSize + (images.Count * iconDirEntrySize); + for (int i = 0; i < images.Count; i++) + { + var imageSize = imageSizes[i]; + // Write the width / height, 0 means 256 + binaryWriter.Write(imageSize.Width == 256 ? (byte)0 : (byte)imageSize.Width); + binaryWriter.Write(imageSize.Height == 256 ? (byte)0 : (byte)imageSize.Height); + binaryWriter.Write((byte)0); // no pallete + binaryWriter.Write((byte)0); // reserved + binaryWriter.Write((short)0); // no color planes + binaryWriter.Write((short)32); // 32 bpp + binaryWriter.Write((int)encodedImages[i].Length); // image data length + binaryWriter.Write(offset); + offset += (int)encodedImages[i].Length; + } + + binaryWriter.Flush(); + // + // Write image data + // + foreach (var encodedImage in encodedImages) + { + encodedImage.WriteTo(stream); + encodedImage.Dispose(); + } + + // TODO: Implement this + return true; + } + + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + _ = stream.Seek(0, SeekOrigin.Current); + + // Icon logic, try to get the Vista icon, else the biggest possible + try + { + using Image tmpImage = ExtractVistaIcon(stream); + if (tmpImage != null) + { + bitmap = ImageHelper.Clone(tmpImage, PixelFormat.Format32bppArgb); + return true; + } + } + catch (Exception vistaIconException) + { + Log.Warn("Can't read icon", vistaIconException); + } + + try + { + // No vista icon, try normal icon + stream.Position = stream.Seek(0, SeekOrigin.Begin); + // We create a copy of the bitmap, so everything else can be disposed + using Icon tmpIcon = new Icon(stream, new Size(1024, 1024)); + using Image tmpImage = tmpIcon.ToBitmap(); + bitmap = ImageHelper.Clone(tmpImage, PixelFormat.Format32bppArgb); + return true; + } + catch (Exception iconException) + { + Log.Warn("Can't read icon", iconException); + } + + bitmap = null; + return false; + } + + /// + /// Based on: https://www.codeproject.com/KB/cs/IconExtractor.aspx + /// And a hint from: https://www.codeproject.com/KB/cs/IconLib.aspx + /// + /// Stream with the icon information + /// Bitmap with the Vista Icon (256x256) + private static Bitmap ExtractVistaIcon(Stream iconStream) + { + const int sizeIconDir = 6; + const int sizeIconDirEntry = 16; + Bitmap bmpPngExtracted = null; + try + { + byte[] srcBuf = new byte[iconStream.Length]; + // TODO: Check if there is a need to process the result + _ = iconStream.Read(srcBuf, 0, (int)iconStream.Length); + int iCount = BitConverter.ToInt16(srcBuf, 4); + for (int iIndex = 0; iIndex < iCount; iIndex++) + { + int iWidth = srcBuf[sizeIconDir + sizeIconDirEntry * iIndex]; + int iHeight = srcBuf[sizeIconDir + sizeIconDirEntry * iIndex + 1]; + if (iWidth != 0 || iHeight != 0) continue; + + int iImageSize = BitConverter.ToInt32(srcBuf, sizeIconDir + sizeIconDirEntry * iIndex + 8); + int iImageOffset = BitConverter.ToInt32(srcBuf, sizeIconDir + sizeIconDirEntry * iIndex + 12); + using MemoryStream destStream = new MemoryStream(); + destStream.Write(srcBuf, iImageOffset, iImageSize); + destStream.Seek(0, SeekOrigin.Begin); + bmpPngExtracted = new Bitmap(destStream); // This is PNG! :) + break; + } + } + catch + { + return null; + } + + return bmpPngExtracted; + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/MetaFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/MetaFileFormatHandler.cs new file mode 100644 index 000000000..04c3825b3 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/MetaFileFormatHandler.cs @@ -0,0 +1,81 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Base.Interfaces.Plugin; +using Greenshot.Editor.Drawing; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// This handles the Windows metafile files + /// + public class MetaFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private readonly IReadOnlyCollection _ourExtensions = new[] { ".wmf", ".emf" }; + + public MetaFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + } + + /// + public override bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + return false; + } + + /// + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + try + { + if (Image.FromStream(stream, true, true) is Metafile metaFile) + { + bitmap = ImageHelper.Clone(metaFile, PixelFormat.Format32bppArgb); + return true; + } + } + catch + { + // Ignore + } + bitmap = null; + return false; + } + + /// + public override IEnumerable LoadDrawablesFromStream(Stream stream, string extension, ISurface surface = null) + { + if (Image.FromStream(stream, true, true) is Metafile metaFile) + { + yield return new MetafileContainer(metaFile, surface); + } + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/SvgFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/SvgFileFormatHandler.cs new file mode 100644 index 000000000..76c5e85b9 --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/SvgFileFormatHandler.cs @@ -0,0 +1,89 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Base.Interfaces.Plugin; +using Greenshot.Editor.Drawing; +using log4net; +using Svg; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// This handled the loading of SVG images to the editor + /// + public class SvgFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private static readonly ILog Log = LogManager.GetLogger(typeof(SvgFileFormatHandler)); + private readonly IReadOnlyCollection _ourExtensions = new[] { ".svg" }; + + public SvgFileFormatHandler() + { + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = _ourExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = _ourExtensions; + } + + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + var svgDocument = SvgDocument.Open(stream); + + try + { + bitmap = svgDocument.Draw(); + return true; + } + catch (Exception ex) + { + Log.Error("Can't load SVG", ex); + } + bitmap = null; + return false; + } + + public override bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + // TODO: Implement this + return false; + } + + public override IEnumerable LoadDrawablesFromStream(Stream stream, string extension, ISurface parent = null) + { + SvgContainer svgContainer = null; + try + { + svgContainer = new SvgContainer(stream, parent); + } + catch (Exception ex) + { + Log.Error("Can't load SVG", ex); + } + if (svgContainer != null) + { + yield return svgContainer; + } + } + } +} diff --git a/src/Greenshot.Editor/FileFormatHandlers/WpfFileFormatHandler.cs b/src/Greenshot.Editor/FileFormatHandlers/WpfFileFormatHandler.cs new file mode 100644 index 000000000..2d655bb1b --- /dev/null +++ b/src/Greenshot.Editor/FileFormatHandlers/WpfFileFormatHandler.cs @@ -0,0 +1,144 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Media.Imaging; +using Greenshot.Base.Interfaces; +using Greenshot.Base.Core; +using Greenshot.Base.Interfaces.Plugin; +using log4net; +using Microsoft.Win32; + +namespace Greenshot.Editor.FileFormatHandlers +{ + /// + /// This is the System.Windows.Media.Imaging (WPF) file format handler, which uses WIC + /// + public class WpfFileFormatHandler : AbstractFileFormatHandler, IFileFormatHandler + { + private static readonly ILog Log = LogManager.GetLogger(typeof(WpfFileFormatHandler)); + private const string HeifDecoder = "{E9A4A80A-44FE-4DE4-8971-7150B10A5199}"; + private const string WicDecoderCategory = "{7ED96837-96F0-4812-B211-F13C24117ED3}"; + + private IReadOnlyCollection LoadFromStreamExtensions { get; } = new []{ ".jxr", ".dds", ".hdp", ".wdp", ".wmp"}; + private IReadOnlyCollection SaveToStreamExtensions { get; } = new[] { ".jxr" }; + + public WpfFileFormatHandler() + { + LoadFromStreamExtensions = LoadFromStreamExtensions.ToList().Concat(RetrieveSupportedExtensions()).OrderBy(e => e).Distinct().ToArray(); + + SupportedExtensions[FileFormatHandlerActions.LoadDrawableFromStream] = LoadFromStreamExtensions; + SupportedExtensions[FileFormatHandlerActions.LoadFromStream] = LoadFromStreamExtensions; + SupportedExtensions[FileFormatHandlerActions.SaveToStream] = SaveToStreamExtensions; + } + + /// + /// Detect all the formats WIC supports + /// + /// IEnumerable{string} + private IEnumerable RetrieveSupportedExtensions() + { + string baseKeyPath; + if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) + { + baseKeyPath = "Wow6432Node\\CLSID"; + } + else + { + baseKeyPath = "CLSID"; + } + + using RegistryKey baseKey = Registry.ClassesRoot.OpenSubKey(baseKeyPath, false); + if (baseKey == null) yield break; + + var wicDecoderCategoryPath = Path.Combine(baseKeyPath, WicDecoderCategory, "instance"); + using RegistryKey categoryKey = Registry.ClassesRoot.OpenSubKey(wicDecoderCategoryPath, false); + if (categoryKey == null) + { + yield break; + } + foreach (var codecGuid in categoryKey.GetSubKeyNames()) + { + // Read the properties of the single registered decoder + using var codecKey = baseKey.OpenSubKey(codecGuid); + if (codecKey == null) continue; + + var fileExtensions = Convert.ToString(codecKey.GetValue("FileExtensions", "")).ToLowerInvariant(); + foreach (var fileExtension in fileExtensions.Split(',')) + { + yield return fileExtension; + } + } + var heifDecoderPath = Path.Combine(baseKeyPath, HeifDecoder); + + using RegistryKey heifKey = Registry.ClassesRoot.OpenSubKey(heifDecoderPath, false); + if (heifKey == null) yield break; + + yield return ".heic"; + yield return ".heif"; + } + + /// + public override bool TrySaveToStream(Bitmap bitmap, Stream destination, string extension, ISurface surface = null, SurfaceOutputSettings surfaceOutputSettings = null) + { + surfaceOutputSettings ??= new SurfaceOutputSettings(); + try + { + var bitmapSource = bitmap.ToBitmapSource(); + var bitmapFrame = BitmapFrame.Create(bitmapSource); + var jpegXrEncoder = new WmpBitmapEncoder(); + jpegXrEncoder.Frames.Add(bitmapFrame); + // TODO: Support supplying a quality + jpegXrEncoder.ImageQualityLevel = surfaceOutputSettings.JPGQuality / 100f; + jpegXrEncoder.Save(destination); + return true; + } + catch (Exception ex) + { + Log.Error("Couldn't save image as JPEG XR: ", ex); + return false; + } + } + + /// + public override bool TryLoadFromStream(Stream stream, string extension, out Bitmap bitmap) + { + try + { + var bitmapDecoder = BitmapDecoder.Create(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); + var bitmapSource = bitmapDecoder.Frames[0]; + bitmap = bitmapSource.ToBitmap(); + return true; + } + catch (Exception ex) + { + Log.Error("Couldn't load image: ", ex); + } + + bitmap = null; + return false; + } + } +} diff --git a/src/Greenshot.Editor/Forms/ColorDialog.cs b/src/Greenshot.Editor/Forms/ColorDialog.cs index ce8dd4b4c..2a146012a 100644 --- a/src/Greenshot.Editor/Forms/ColorDialog.cs +++ b/src/Greenshot.Editor/Forms/ColorDialog.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.Globalization; using System.Threading; diff --git a/src/Greenshot.Editor/Forms/ColorPickerToolStripButton.cs b/src/Greenshot.Editor/Forms/ColorPickerToolStripButton.cs index 7a5123893..858be9c3a 100644 --- a/src/Greenshot.Editor/Forms/ColorPickerToolStripButton.cs +++ b/src/Greenshot.Editor/Forms/ColorPickerToolStripButton.cs @@ -20,10 +20,11 @@ */ using System; -using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; namespace Greenshot.Editor.Forms { @@ -32,7 +33,7 @@ namespace Greenshot.Editor.Forms public class ColorPickerToolStripButton : ToolStripButton { private Color _color; - public Point Offset = new Point(0, 0); + public NativePoint Offset = new NativePoint(0, 0); public event ColorPickerEventHandler ColorPicked; private readonly ColorDialog _cd; @@ -56,29 +57,24 @@ namespace Greenshot.Editor.Forms protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); - if (_color != null) + if (_color == null) return; + // replace transparent color with selected color + Graphics g = e.Graphics; + ColorMap[] colorMap = new ColorMap[1]; + colorMap[0] = new ColorMap { - // replace transparent color with selected color - Graphics g = e.Graphics; - //Graphics g = Graphics.FromImage(Image); - ColorMap[] colorMap = new ColorMap[1]; - colorMap[0] = new ColorMap - { - OldColor = Color.Magenta, //this.ImageTransparentColor; - NewColor = _color - }; - ImageAttributes attr = new ImageAttributes(); - attr.SetRemapTable(colorMap); - Rectangle rect = new Rectangle(0, 0, Image.Width, Image.Height); - // todo find a way to retrieve transparency offset automatically - // for now, we use the public variable Offset to define this manually - rect.Offset(Offset.X, Offset.Y); - //Image. - Debug.WriteLine("paint!" + Text + ": " + _color); - //ssif(color.Equals(Color.Transparent)) ((Bitmap)Image).MakeTransparent(Color.Magenta); - g.DrawImage(Image, rect, 0, 0, rect.Width, rect.Height, GraphicsUnit.Pixel, attr); - //this.Image.In - } + OldColor = Color.Magenta, //this.ImageTransparentColor; + NewColor = _color + }; + ImageAttributes attr = new ImageAttributes(); + attr.SetRemapTable(colorMap); + var rect = new NativeRect(0, 0, Image.Width, Image.Height); + // todo find a way to retrieve transparency offset automatically + // for now, we use the public variable Offset to define this manually + rect = rect.Offset(Offset.X, Offset.Y); + //ssif(color.Equals(Color.Transparent)) ((Bitmap)Image).MakeTransparent(Color.Magenta); + g.DrawImage(Image, rect, 0, 0, rect.Width, rect.Height, GraphicsUnit.Pixel, attr); + //this.Image.In } void ToolStripButton1Click(object sender, EventArgs e) diff --git a/src/Greenshot.Editor/Forms/DropShadowSettingsForm.cs b/src/Greenshot.Editor/Forms/DropShadowSettingsForm.cs index fcec47c95..c05852109 100644 --- a/src/Greenshot.Editor/Forms/DropShadowSettingsForm.cs +++ b/src/Greenshot.Editor/Forms/DropShadowSettingsForm.cs @@ -22,6 +22,7 @@ using System; using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Effects; namespace Greenshot.Editor.Forms @@ -51,7 +52,7 @@ namespace Greenshot.Editor.Forms private void ButtonOK_Click(object sender, EventArgs e) { _effect.Darkness = trackBar1.Value / (float) 40; - _effect.ShadowOffset = new Point((int) offsetX.Value, (int) offsetY.Value); + _effect.ShadowOffset = new NativePoint((int) offsetX.Value, (int) offsetY.Value); _effect.ShadowSize = (int) thickness.Value; DialogResult = DialogResult.OK; } diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs index 82fecf559..c0a8f8a63 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs @@ -38,7 +38,6 @@ namespace Greenshot.Editor.Forms { protected override void Dispose(bool disposing) { if (disposing) { - DpiChanged -= AdjustToDpi; if (components != null) { components.Dispose(); } @@ -98,8 +97,6 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.preferencesToolStripMenuItem = new GreenshotToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.autoCropToolStripMenuItem = new GreenshotToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.insert_window_toolstripmenuitem = new GreenshotToolStripMenuItem(); this.objectToolStripMenuItem = new GreenshotToolStripMenuItem(); this.addRectangleToolStripMenuItem = new GreenshotToolStripMenuItem(); @@ -144,8 +141,13 @@ namespace Greenshot.Editor.Forms { this.btnHelp = new GreenshotToolStripButton(); this.propertiesToolStrip = new ToolStripEx(); this.obfuscateModeButton = new BindableToolStripDropDownButton(); + this.cropModeButton = new BindableToolStripDropDownButton(); this.pixelizeToolStripMenuItem = new GreenshotToolStripMenuItem(); this.blurToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.defaultCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.verticalCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.horizontalCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.autoCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); this.highlightModeButton = new BindableToolStripDropDownButton(); this.textHighlightMenuItem = new GreenshotToolStripMenuItem(); this.areaHighlightMenuItem = new GreenshotToolStripMenuItem(); @@ -319,7 +321,7 @@ namespace Greenshot.Editor.Forms { // toolsToolStrip // this.toolsToolStrip.ClickThrough = true; - this.toolsToolStrip.ImageScalingSize = coreConfiguration.ScaledIconSize; + this.toolsToolStrip.ImageScalingSize = coreConfiguration.IconSize; this.toolsToolStrip.Dock = System.Windows.Forms.DockStyle.None; this.toolsToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.toolsToolStrip.Renderer = new CustomToolStripProfessionalRenderer(); @@ -555,7 +557,7 @@ namespace Greenshot.Editor.Forms { // menuStrip1 // this.menuStrip1.ClickThrough = true; - this.menuStrip1.ImageScalingSize = coreConfiguration.ScaledIconSize; + this.menuStrip1.ImageScalingSize = coreConfiguration.IconSize; this.menuStrip1.Dock = System.Windows.Forms.DockStyle.Fill; this.menuStrip1.Stretch = true; this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -593,8 +595,6 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator12, this.preferencesToolStripMenuItem, this.toolStripSeparator5, - this.autoCropToolStripMenuItem, - this.toolStripSeparator17, this.insert_window_toolstripmenuitem}); this.editToolStripMenuItem.LanguageKey = "editor_edit"; this.editToolStripMenuItem.Name = "editToolStripMenuItem"; @@ -678,16 +678,6 @@ namespace Greenshot.Editor.Forms { // this.toolStripSeparator5.Name = "toolStripSeparator5"; // - // autoCropToolStripMenuItem - // - this.autoCropToolStripMenuItem.LanguageKey = "editor_autocrop"; - this.autoCropToolStripMenuItem.Name = "autoCropToolStripMenuItem"; - this.autoCropToolStripMenuItem.Click += new System.EventHandler(this.AutoCropToolStripMenuItemClick); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - // // insert_window_toolstripmenuitem // this.insert_window_toolstripmenuitem.LanguageKey = "editor_insertwindow"; @@ -885,7 +875,7 @@ namespace Greenshot.Editor.Forms { // destinationsToolStrip // this.destinationsToolStrip.ClickThrough = true; - this.destinationsToolStrip.ImageScalingSize = coreConfiguration.ScaledIconSize; + this.destinationsToolStrip.ImageScalingSize = coreConfiguration.IconSize; this.destinationsToolStrip.Dock = System.Windows.Forms.DockStyle.Fill; this.destinationsToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.destinationsToolStrip.Name = "toolStrip1"; @@ -1040,10 +1030,10 @@ namespace Greenshot.Editor.Forms { // propertiesToolStrip // this.propertiesToolStrip.ClickThrough = true; - this.propertiesToolStrip.ImageScalingSize = coreConfiguration.ScaledIconSize; + this.propertiesToolStrip.ImageScalingSize = coreConfiguration.IconSize; this.propertiesToolStrip.Dock = System.Windows.Forms.DockStyle.Fill; this.propertiesToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.propertiesToolStrip.MinimumSize = new System.Drawing.Size(150, coreConfiguration.ScaledIconSize.Height + 10); + this.propertiesToolStrip.MinimumSize = new System.Drawing.Size(150, coreConfiguration.IconSize.Height + 10); this.propertiesToolStrip.Name = "propertiesToolStrip"; this.propertiesToolStrip.Stretch = true; this.propertiesToolStrip.TabIndex = 2; @@ -1082,6 +1072,7 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator10, this.btnConfirm, this.btnCancel, + this.cropModeButton, this.counterLabel, this.counterUpDown}); // @@ -1098,6 +1089,7 @@ namespace Greenshot.Editor.Forms { this.obfuscateModeButton.SelectedTag = FilterContainer.PreparedFilter.BLUR; this.obfuscateModeButton.Tag = FilterContainer.PreparedFilter.BLUR; // + this.obfuscateModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; // pixelizeToolStripMenuItem // this.pixelizeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pixelizeToolStripMenuItem.Image"))); @@ -1111,6 +1103,55 @@ namespace Greenshot.Editor.Forms { this.blurToolStripMenuItem.LanguageKey = "editor_obfuscate_blur"; this.blurToolStripMenuItem.Name = "blurToolStripMenuItem"; this.blurToolStripMenuItem.Tag = FilterContainer.PreparedFilter.BLUR; + + // + // cropModeButton + // + this.cropModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cropModeButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.defaultCropModeToolStripMenuItem, + this.verticalCropModeToolStripMenuItem, + this.horizontalCropModeToolStripMenuItem, + this.autoCropModeToolStripMenuItem}); + this.cropModeButton.Image = ((System.Drawing.Image)(resources.GetObject("btnCrop.Image"))); + this.cropModeButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cropModeButton.LanguageKey = "editor_crop_mode"; + this.cropModeButton.Name = "cropModeButton"; + this.cropModeButton.SelectedTag = CropContainer.CropModes.Default; + this.cropModeButton.Tag = CropContainer.CropModes.Default; + this.cropModeButton.DropDownItemClicked += CropStyleDropDownItemClicked; + // + // defaultCropStyleToolStripMenuItem + // + this.defaultCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("btnCrop.Image"))); + this.defaultCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_default"; + this.defaultCropModeToolStripMenuItem.Name = "defaultCropModeToolStripMenuItem"; + this.defaultCropModeToolStripMenuItem.Tag = CropContainer.CropModes.Default; + + // + // verticalCropStyleToolStripMenuItem + // + this.verticalCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("CropVertical.Image"))); + this.verticalCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_vertical"; + this.verticalCropModeToolStripMenuItem.Name = "verticalCropModeToolStripMenuItem"; + this.verticalCropModeToolStripMenuItem.Tag = CropContainer.CropModes.Vertical; + + // + // horizontalCropStyleToolStripMenuItem + // + this.horizontalCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("CropHorizontal.Image"))); + this.horizontalCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_horizontal"; + this.horizontalCropModeToolStripMenuItem.Name = "horizontalCropModeToolStripMenuItem"; + this.horizontalCropModeToolStripMenuItem.Tag = CropContainer.CropModes.Horizontal; + + // + // autoCropModeToolStripMenuItem + // + this.autoCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("AutoCrop.Image"))); + this.autoCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_auto"; + this.autoCropModeToolStripMenuItem.Name = "autoCropModeToolStripMenuItem"; + this.autoCropModeToolStripMenuItem.Tag = CropContainer.CropModes.AutoCrop; + // // highlightModeButton // @@ -1126,6 +1167,7 @@ namespace Greenshot.Editor.Forms { this.highlightModeButton.Name = "highlightModeButton"; this.highlightModeButton.SelectedTag = FilterContainer.PreparedFilter.TEXT_HIGHTLIGHT; this.highlightModeButton.Tag = FilterContainer.PreparedFilter.TEXT_HIGHTLIGHT; + this.highlightModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; // // textHighlightMenuItem // @@ -1233,6 +1275,7 @@ namespace Greenshot.Editor.Forms { this.fontFamilyComboBox.Padding = new System.Windows.Forms.Padding(2,0,0,2); this.fontFamilyComboBox.GotFocus += new System.EventHandler(this.ToolBarFocusableElementGotFocus); this.fontFamilyComboBox.LostFocus += new System.EventHandler(this.ToolBarFocusableElementLostFocus); + this.fontFamilyComboBox.PropertyChanged += FontPropertyChanged; // // fontSizeLabel // @@ -1873,6 +1916,11 @@ namespace Greenshot.Editor.Forms { private BindableToolStripButton btnConfirm; private GreenshotToolStripMenuItem selectAllToolStripMenuItem; private BindableToolStripDropDownButton highlightModeButton; + private BindableToolStripDropDownButton cropModeButton; + private GreenshotToolStripMenuItem defaultCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem verticalCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem horizontalCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem autoCropModeToolStripMenuItem; private GreenshotToolStripMenuItem pixelizeToolStripMenuItem; private GreenshotToolStripMenuItem blurToolStripMenuItem; private BindableToolStripDropDownButton obfuscateModeButton; @@ -1982,8 +2030,6 @@ namespace Greenshot.Editor.Forms { private NonJumpingPanel panel1; private ToolStripColorButton btnFillColor; private ToolStripColorButton btnLineColor; - private GreenshotToolStripMenuItem autoCropToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator17; private System.Windows.Forms.ContextMenuStrip zoomMenuStrip; private System.Windows.Forms.ToolStripMenuItem zoomInMenuItem; private System.Windows.Forms.ToolStripMenuItem zoomOutMenuItem; diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.cs index 3e1be9489..97263d8c2 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.cs @@ -25,8 +25,15 @@ using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Threading; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Dpi; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Structs; using Greenshot.Base; using Greenshot.Base.Controls; using Greenshot.Base.Core; @@ -36,8 +43,6 @@ using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Forms; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Structs; using Greenshot.Editor.Configuration; using Greenshot.Editor.Destinations; using Greenshot.Editor.Drawing; @@ -49,20 +54,20 @@ using log4net; namespace Greenshot.Editor.Forms { /// - /// Description of ImageEditorForm. + /// The ImageEditorForm is the editor for Greenshot /// public partial class ImageEditorForm : EditorForm, IImageEditor { private static readonly ILog Log = LogManager.GetLogger(typeof(ImageEditorForm)); private static readonly EditorConfiguration EditorConfiguration = IniConfig.GetIniSection(); - private static readonly List IgnoreDestinations = new List + private static readonly List IgnoreDestinations = new() { nameof(WellKnownDestinations.Picker), EditorDestination.DESIGNATION }; - private static readonly List EditorList = new List(); + private static readonly List EditorList = new(); private Surface _surface; private GreenshotToolStripButton[] _toolbarButtons; @@ -78,7 +83,7 @@ namespace Greenshot.Editor.Forms // whether part of the editor controls are disabled depending on selected item(s) private bool _controlsDisabledDueToConfirmable; - // Used for tracking the mouse scrollwheel changes + // Used for tracking the mouse scroll wheel changes private DateTime _zoomStartTime = DateTime.Now; /// @@ -109,19 +114,17 @@ namespace Greenshot.Editor.Forms /// /// Adjust the icons etc to the supplied DPI settings /// - /// - /// DpiChangedEventArgs - private void AdjustToDpi(object sender, DpiChangedEventArgs dpiChangedEventArgs) + /// + /// + protected override void DpiChangedHandler(int oldDpi, int newDpi) { - var dpi = DpiHelper.GetDpi(Handle); - var newSize = DpiHelper.ScaleWithDpi(coreConfiguration.IconSize, dpi); + var newSize = DpiCalculator.ScaleWithDpi(coreConfiguration.IconSize, newDpi); toolsToolStrip.ImageScalingSize = newSize; menuStrip1.ImageScalingSize = newSize; destinationsToolStrip.ImageScalingSize = newSize; propertiesToolStrip.ImageScalingSize = newSize; propertiesToolStrip.MinimumSize = new Size(150, newSize.Height + 10); - - _surface?.AdjustToDpi(dpi); + _surface?.AdjustToDpi(newDpi); UpdateUi(); } @@ -147,7 +150,6 @@ namespace Greenshot.Editor.Forms ManualLanguageApply = true; InitializeComponent(); // Make sure we change the icon size depending on the scaling - DpiChanged += AdjustToDpi; Load += delegate { var thread = new Thread(AddDestinations) @@ -155,21 +157,19 @@ namespace Greenshot.Editor.Forms Name = "add destinations" }; thread.Start(); - - AdjustToDpi(null, null); }; // Make sure the editor is placed on the same location as the last editor was on close // But only if this still exists, else it will be reset (BUG-1812) WindowPlacement editorWindowPlacement = EditorConfiguration.GetEditorPlacement(); - Rectangle screenBounds = WindowCapture.GetScreenBounds(); + NativeRect screenBounds = DisplayInfo.ScreenBounds; if (!screenBounds.Contains(editorWindowPlacement.NormalPosition)) { EditorConfiguration.ResetEditorPlacement(); } // ReSharper disable once UnusedVariable - WindowDetails thisForm = new WindowDetails(Handle) + WindowDetails thisForm = new(Handle) { WindowPlacement = EditorConfiguration.GetEditorPlacement() }; @@ -181,6 +181,23 @@ namespace Greenshot.Editor.Forms UpdateUi(); + // Workaround: for the MouseWheel event which doesn't get to the panel + MouseWheel += PanelMouseWheel; + + // Use best fit, for those capture modes where we can get huge images + bool useBestFit = _surface.CaptureDetails.CaptureMode switch + { + CaptureMode.File => true, + CaptureMode.Clipboard => true, + CaptureMode.IE => true, + _ => false + }; + + if (useBestFit) + { + ZoomBestFitMenuItemClick(this, EventArgs.Empty); + } + // Workaround: As the cursor is (mostly) selected on the surface a funny artifact is visible, this fixes it. HideToolstripItems(); } @@ -266,11 +283,6 @@ namespace Greenshot.Editor.Forms // a smaller size than the initial panel size (as set by the forms designer) panel1.Height = 10; - fontFamilyComboBox.PropertyChanged += FontPropertyChanged; - - obfuscateModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; - highlightModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; - _toolbarButtons = new[] { btnCursor, btnRect, btnEllipse, btnText, btnLine, btnArrow, btnFreehand, btnHighlight, btnObfuscate, btnCrop, btnStepLabel, btnSpeechBubble @@ -279,9 +291,6 @@ namespace Greenshot.Editor.Forms pluginToolStripMenuItem.Visible = pluginToolStripMenuItem.DropDownItems.Count > 0; - // Workaround: for the MouseWheel event which doesn't get to the panel - MouseWheel += PanelMouseWheel; - // Make sure the value is set correctly when starting if (Surface != null) { @@ -303,9 +312,8 @@ namespace Greenshot.Editor.Forms // Loop over all items in the propertiesToolStrip foreach (ToolStripItem item in propertiesToolStrip.Items) { - var cb = item as ToolStripComboBox; // Only ToolStripComboBox that are visible - if (cb == null || !cb.Visible) + if (item is not ToolStripComboBox { Visible: true } cb) { continue; } @@ -313,7 +321,7 @@ namespace Greenshot.Editor.Forms if (cb.ComboBox == null) continue; // Calculate the rectangle - Rectangle r = new Rectangle(cb.ComboBox.Location.X - 1, cb.ComboBox.Location.Y - 1, cb.ComboBox.Size.Width + 1, cb.ComboBox.Size.Height + 1); + var r = new NativeRect(cb.ComboBox.Location.X - 1, cb.ComboBox.Location.Y - 1, cb.ComboBox.Size.Width + 1, cb.ComboBox.Size.Height + 1); // Draw the rectangle e.Graphics.DrawRectangle(cbBorderPen, r); @@ -362,7 +370,7 @@ namespace Greenshot.Editor.Forms { if (toolstripDestination.IsDynamic) { - ToolStripSplitButton destinationButton = new ToolStripSplitButton + ToolStripSplitButton destinationButton = new() { DisplayStyle = ToolStripItemDisplayStyle.Image, Size = new Size(23, 22), @@ -713,7 +721,10 @@ namespace Greenshot.Editor.Forms private void BtnCropClick(object sender, EventArgs e) { + if (_surface.DrawingMode == DrawingModes.Crop) return; + _surface.DrawingMode = DrawingModes.Crop; + InitCropMode((CropContainer.CropModes)_surface.FieldAggregator.GetField(FieldType.CROPMODE).Value); RefreshFieldControls(); } @@ -963,7 +974,7 @@ namespace Greenshot.Editor.Forms GC.Collect(); if (coreConfiguration.MinimizeWorkingSetSize) { - PsAPI.EmptyWorkingSet(); + PsApi.EmptyWorkingSet(); } } @@ -1012,6 +1023,9 @@ namespace Greenshot.Editor.Forms case Keys.C: BtnCropClick(sender, e); break; + case Keys.Z: + BtnResizeClick(sender, e); + break; } } else if (e.Modifiers.Equals(Keys.Control)) @@ -1085,13 +1099,8 @@ namespace Greenshot.Editor.Forms /// /// This is a "work-around" for the MouseWheel event which doesn't get to the panel /// - /// - /// - /// - /// This is a "work-around" for the MouseWheel event which doesn't get to the panel - /// - /// - /// + /// object + /// MouseEventArgs private void PanelMouseWheel(object sender, MouseEventArgs e) { if (System.Windows.Forms.Control.ModifierKeys.Equals(Keys.Control)) @@ -1278,6 +1287,7 @@ namespace Greenshot.Editor.Forms new BidirectionalBinding(previewQualityUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); new BidirectionalBinding(obfuscateModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); + new BidirectionalBinding(cropModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.CROPMODE), "Value"); new BidirectionalBinding(highlightModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); new BidirectionalBinding(counterUpDown, "Value", _surface, "CounterStart", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); } @@ -1290,7 +1300,7 @@ namespace Greenshot.Editor.Forms propertiesToolStrip.SuspendLayout(); if (_surface.HasSelectedElements || _surface.DrawingMode != DrawingModes.None) { - FieldAggregator props = _surface.FieldAggregator; + var props = (FieldAggregator)_surface.FieldAggregator; btnFillColor.Visible = props.HasFieldValue(FieldType.FILL_COLOR); btnLineColor.Visible = props.HasFieldValue(FieldType.LINE_COLOR); lineThicknessLabel.Visible = lineThicknessUpDown.Visible = props.HasFieldValue(FieldType.LINE_THICKNESS); @@ -1307,12 +1317,13 @@ namespace Greenshot.Editor.Forms textHorizontalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_HORIZONTAL_ALIGNMENT); textVerticalAlignmentButton.Visible = props.HasFieldValue(FieldType.TEXT_VERTICAL_ALIGNMENT); shadowButton.Visible = props.HasFieldValue(FieldType.SHADOW); - counterLabel.Visible = counterUpDown.Visible = props.HasFieldValue(FieldType.FLAGS) - && ((FieldFlag) props.GetFieldValue(FieldType.FLAGS) & FieldFlag.COUNTER) == FieldFlag.COUNTER; - btnConfirm.Visible = btnCancel.Visible = props.HasFieldValue(FieldType.FLAGS) - && ((FieldFlag) props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE; + counterLabel.Visible = counterUpDown.Visible = props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag)props.GetFieldValue(FieldType.FLAGS)).HasFlag(FieldFlag.COUNTER); + + btnConfirm.Visible = btnCancel.Visible = props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag) props.GetFieldValue(FieldType.FLAGS)).HasFlag(FieldFlag.CONFIRMABLE); + btnConfirm.Enabled = _surface.HasSelectedElements; obfuscateModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_OBFUSCATE); + cropModeButton.Visible = props.HasFieldValue(FieldType.CROPMODE); highlightModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); } else @@ -1350,7 +1361,7 @@ namespace Greenshot.Editor.Forms btnStepLabel.Image = icon; addCounterToolStripMenuItem.Image = icon; - FieldAggregator props = _surface.FieldAggregator; + FieldAggregator props = (FieldAggregator)_surface.FieldAggregator; // if a confirmable element is selected, we must disable most of the controls // since we demand confirmation or cancel for confirmable element if (props.HasFieldValue(FieldType.FLAGS) && ((FieldFlag) props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE) @@ -1568,6 +1579,39 @@ namespace Greenshot.Editor.Forms Invalidate(true); } + protected void CropStyleDropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + InitCropMode((CropContainer.CropModes)e.ClickedItem.Tag); + + RefreshFieldControls(); + Invalidate(true); + } + + private void InitCropMode(CropContainer.CropModes mode) + { + var cropArea = _surface.Elements.FirstOrDefault(c => c is CropContainer)?.Bounds; + + _surface.DrawingMode = DrawingModes.None; + _surface.RemoveCropContainer(); + + if (mode == CropContainer.CropModes.AutoCrop) + { + if (!_surface.AutoCrop(cropArea)) + { + //not AutoCrop possible automatic switch to default crop mode + _surface.DrawingMode = DrawingModes.Crop; + _surface.FieldAggregator.GetField(FieldType.CROPMODE).Value = CropContainer.CropModes.Default; + this.cropModeButton.SelectedTag = CropContainer.CropModes.Default; + this.statusLabel.Text = Language.GetString(LangKey.editor_autocrop_not_possible); + } + } + else + { + _surface.DrawingMode = DrawingModes.Crop; + } + RefreshEditorControls(); + } + private void SelectAllToolStripMenuItemClick(object sender, EventArgs e) { _surface.SelectAllElements(); @@ -1576,14 +1620,14 @@ namespace Greenshot.Editor.Forms private void BtnConfirmClick(object sender, EventArgs e) { - _surface.ConfirmSelectedConfirmableElements(true); - RefreshFieldControls(); + _surface.Confirm(true); + RefreshEditorControls(); } private void BtnCancelClick(object sender, EventArgs e) { - _surface.ConfirmSelectedConfirmableElements(false); - RefreshFieldControls(); + _surface.Confirm(false); + RefreshEditorControls(); } private void Insert_window_toolstripmenuitemMouseEnter(object sender, EventArgs e) @@ -1629,14 +1673,6 @@ namespace Greenshot.Editor.Forms } } - private void AutoCropToolStripMenuItemClick(object sender, EventArgs e) - { - if (_surface.AutoCrop()) - { - RefreshFieldControls(); - } - } - private void AddBorderToolStripMenuItemClick(object sender, EventArgs e) { _surface.ApplyBitmapEffect(new BorderEffect()); @@ -1661,13 +1697,13 @@ namespace Greenshot.Editor.Forms /// private void ShrinkCanvasToolStripMenuItemClick(object sender, EventArgs e) { - Rectangle cropRectangle; + NativeRect cropRectangle; using (Image tmpImage = GetImageForExport()) { cropRectangle = ImageHelper.FindAutoCropRectangle(tmpImage, coreConfiguration.AutoCropDifference); } - if (_surface.IsCropPossible(ref cropRectangle)) + if (_surface.IsCropPossible(ref cropRectangle, CropContainer.CropModes.AutoCrop)) { _surface.ApplyCrop(cropRectangle); UpdateUndoRedoSurfaceDependencies(); @@ -1916,8 +1952,7 @@ namespace Greenshot.Editor.Forms private void ZoomSetValue(Fraction value) { var surface = Surface as Surface; - var panel = surface?.Parent as Panel; - if (panel == null) + if (surface?.Parent is not Panel panel) { return; } @@ -1932,9 +1967,8 @@ namespace Greenshot.Editor.Forms var size = surface.Size; if (value > Surface.ZoomFactor) // being smart on zoom-in { - var selection = surface.GetSelectionRectangle(); - selection.Intersect(rc); - if (selection != Rectangle.Empty) + var selection = surface.GetSelectionRectangle().Intersect(rc); + if (selection != NativeRect.Empty) { rc = selection; // zoom to visible part of selection } @@ -1944,12 +1978,12 @@ namespace Greenshot.Editor.Forms // - prefer top left corner to zoom-in as less disorienting for screenshots if (size.Width < rc.Width) { - rc.Width = 0; + rc = rc.ChangeWidth(0); } if (size.Height < rc.Height) { - rc.Height = 0; + rc = rc.ChangeHeight(0); } } } diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.resx b/src/Greenshot.Editor/Forms/ImageEditorForm.resx index 57fe2f2c7..1c5b104fd 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.resx +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.resx @@ -1107,4 +1107,13 @@ 782, 17 + + ..\Resources\AutoCrop.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CropHorizontal.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CropVertical.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/src/Greenshot.Editor/Forms/MovableShowColorForm.cs b/src/Greenshot.Editor/Forms/MovableShowColorForm.cs index fb7962a91..416ec6407 100644 --- a/src/Greenshot.Editor/Forms/MovableShowColorForm.cs +++ b/src/Greenshot.Editor/Forms/MovableShowColorForm.cs @@ -22,7 +22,11 @@ using System; using System.Drawing; using System.Windows.Forms; -using Greenshot.Base.UnmanagedHelpers; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Gdi32; +using Dapplo.Windows.Gdi32.SafeHandles; +using Dapplo.Windows.User32; namespace Greenshot.Editor.Forms { @@ -32,7 +36,7 @@ namespace Greenshot.Editor.Forms /// public partial class MovableShowColorForm : Form { - public Color color + public Color Color { get { return preview.BackColor; } } @@ -45,8 +49,8 @@ namespace Greenshot.Editor.Forms /// /// Move the MovableShowColorForm to the specified location and display the color under the (current mouse) coordinates /// - /// Coordinates - public void MoveTo(Point screenCoordinates) + /// NativePoint with Coordinates + public void MoveTo(NativePoint screenCoordinates) { Color c = GetPixelColor(screenCoordinates); preview.BackColor = c; @@ -56,38 +60,36 @@ namespace Greenshot.Editor.Forms green.Text = string.Empty + c.G; alpha.Text = string.Empty + c.A; - Size cursorSize = Cursor.Current.Size; - Point hotspot = Cursor.Current.HotSpot; + NativeSize cursorSize = Cursor.Current.Size; + NativePoint hotspot = Cursor.Current.HotSpot; - Point zoomerLocation = new Point(screenCoordinates.X, screenCoordinates.Y); - zoomerLocation.X += cursorSize.Width + 5 - hotspot.X; - zoomerLocation.Y += cursorSize.Height + 5 - hotspot.Y; + var zoomerLocation = new NativePoint(screenCoordinates.X, screenCoordinates.Y) + .Offset(cursorSize.Width + 5 - hotspot.X, cursorSize.Height + 5 - hotspot.Y); - foreach (Screen screen in Screen.AllScreens) + foreach (var displayInfo in DisplayInfo.AllDisplayInfos) { - Rectangle screenRectangle = screen.Bounds; - if (screen.Bounds.Contains(screenCoordinates)) + NativeRect screenRectangle = displayInfo.Bounds; + if (!displayInfo.Bounds.Contains(screenCoordinates)) continue; + + if (zoomerLocation.X < screenRectangle.X) { - if (zoomerLocation.X < screenRectangle.X) - { - zoomerLocation.X = screenRectangle.X; - } - else if (zoomerLocation.X + Width > screenRectangle.X + screenRectangle.Width) - { - zoomerLocation.X = screenCoordinates.X - Width - 5 - hotspot.X; - } - - if (zoomerLocation.Y < screenRectangle.Y) - { - zoomerLocation.Y = screenRectangle.Y; - } - else if (zoomerLocation.Y + Height > screenRectangle.Y + screenRectangle.Height) - { - zoomerLocation.Y = screenCoordinates.Y - Height - 5 - hotspot.Y; - } - - break; + zoomerLocation = zoomerLocation.ChangeX(screenRectangle.X); } + else if (zoomerLocation.X + Width > screenRectangle.X + screenRectangle.Width) + { + zoomerLocation = zoomerLocation.ChangeX(screenCoordinates.X - Width - 5 - hotspot.X); + } + + if (zoomerLocation.Y < screenRectangle.Y) + { + zoomerLocation = zoomerLocation.ChangeY(screenRectangle.Y); + } + else if (zoomerLocation.Y + Height > screenRectangle.Y + screenRectangle.Height) + { + zoomerLocation = zoomerLocation.ChangeY(screenCoordinates.Y - Height - 5 - hotspot.Y); + } + + break; } Location = zoomerLocation; @@ -97,14 +99,14 @@ namespace Greenshot.Editor.Forms /// /// Get the color from the pixel on the screen at "x,y" /// - /// Point with the coordinates + /// NativePoint with the coordinates /// Color at the specified screenCoordinates - private static Color GetPixelColor(Point screenCoordinates) + private static Color GetPixelColor(NativePoint screenCoordinates) { - using SafeWindowDcHandle screenDC = SafeWindowDcHandle.FromDesktop(); + using SafeWindowDcHandle safeWindowDcHandle = SafeWindowDcHandle.FromDesktop(); try { - uint pixel = GDI32.GetPixel(screenDC, screenCoordinates.X, screenCoordinates.Y); + uint pixel = Gdi32Api.GetPixel(safeWindowDcHandle, screenCoordinates.X, screenCoordinates.Y); Color color = Color.FromArgb(255, (int) (pixel & 0xFF), (int) (pixel & 0xFF00) >> 8, (int) (pixel & 0xFF0000) >> 16); return color; } diff --git a/src/Greenshot.Editor/Forms/TornEdgeSettingsForm.cs b/src/Greenshot.Editor/Forms/TornEdgeSettingsForm.cs index db29c227f..46638fc6e 100644 --- a/src/Greenshot.Editor/Forms/TornEdgeSettingsForm.cs +++ b/src/Greenshot.Editor/Forms/TornEdgeSettingsForm.cs @@ -20,8 +20,8 @@ */ using System; -using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Effects; namespace Greenshot.Editor.Forms @@ -56,7 +56,7 @@ namespace Greenshot.Editor.Forms private void ButtonOK_Click(object sender, EventArgs e) { _effect.Darkness = shadowDarkness.Value / (float) 40; - _effect.ShadowOffset = new Point((int) offsetX.Value, (int) offsetY.Value); + _effect.ShadowOffset = new NativePoint((int) offsetX.Value, (int) offsetY.Value); _effect.ShadowSize = (int) thickness.Value; _effect.ToothHeight = (int) toothsize.Value; _effect.VerticalToothRange = (int) verticaltoothrange.Value; diff --git a/src/Greenshot.Editor/Greenshot.Editor.csproj b/src/Greenshot.Editor/Greenshot.Editor.csproj index 768bdb99d..5dcd99bc1 100644 --- a/src/Greenshot.Editor/Greenshot.Editor.csproj +++ b/src/Greenshot.Editor/Greenshot.Editor.csproj @@ -1,4 +1,11 @@  + + True + + + none + false + PreserveNewest diff --git a/src/Greenshot.Editor/Helpers/BinaryFormatterHelper.cs b/src/Greenshot.Editor/Helpers/BinaryFormatterHelper.cs new file mode 100644 index 000000000..11c7dbae6 --- /dev/null +++ b/src/Greenshot.Editor/Helpers/BinaryFormatterHelper.cs @@ -0,0 +1,124 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.ServiceModel.Security; +using Greenshot.Base.Interfaces.Drawing; +using Greenshot.Editor.Drawing; +using Greenshot.Editor.Drawing.Fields; +using Greenshot.Editor.Drawing.Filters; +using log4net; +using static Greenshot.Editor.Drawing.FilterContainer; + +namespace Greenshot.Editor.Helpers +{ + /// + /// This helps to map the serialization of the old .greenshot file to the newer. + /// It also prevents misuse. + /// + internal class BinaryFormatterHelper : SerializationBinder + { + private static readonly ILog LOG = LogManager.GetLogger(typeof(BinaryFormatterHelper)); + private static readonly IDictionary TypeMapper = new Dictionary + { + {"System.Guid",typeof(Guid) }, + {"System.Drawing.Rectangle",typeof(System.Drawing.Rectangle) }, + {"System.Drawing.Point",typeof(System.Drawing.Point) }, + {"System.Drawing.Color",typeof(System.Drawing.Color) }, + {"System.Drawing.Bitmap",typeof(System.Drawing.Bitmap) }, + {"System.Drawing.Icon",typeof(System.Drawing.Icon) }, + {"System.Drawing.Size",typeof(System.Drawing.Size) }, + {"System.IO.MemoryStream",typeof(System.IO.MemoryStream) }, + {"System.Drawing.StringAlignment",typeof(System.Drawing.StringAlignment) }, + {"System.Collections.Generic.List`1[[Greenshot.Base.Interfaces.Drawing.IFieldHolder", typeof(List)}, + {"System.Collections.Generic.List`1[[Greenshot.Base.Interfaces.Drawing.IField", typeof(List)}, + {"System.Collections.Generic.List`1[[System.Drawing.Point", typeof(List)}, + {"Greenshot.Editor.Drawing.ArrowContainer", typeof(ArrowContainer) }, + {"Greenshot.Editor.Drawing.ArrowContainer+ArrowHeadCombination", typeof(ArrowContainer.ArrowHeadCombination) }, + {"Greenshot.Editor.Drawing.LineContainer", typeof(LineContainer) }, + {"Greenshot.Editor.Drawing.TextContainer", typeof(TextContainer) }, + {"Greenshot.Editor.Drawing.SpeechbubbleContainer", typeof(SpeechbubbleContainer) }, + {"Greenshot.Editor.Drawing.RectangleContainer", typeof(RectangleContainer) }, + {"Greenshot.Editor.Drawing.EllipseContainer", typeof(EllipseContainer) }, + {"Greenshot.Editor.Drawing.FreehandContainer", typeof(FreehandContainer) }, + {"Greenshot.Editor.Drawing.HighlightContainer", typeof(HighlightContainer) }, + {"Greenshot.Editor.Drawing.IconContainer", typeof(IconContainer) }, + {"Greenshot.Editor.Drawing.ObfuscateContainer", typeof(ObfuscateContainer) }, + {"Greenshot.Editor.Drawing.StepLabelContainer", typeof(StepLabelContainer) }, + {"Greenshot.Editor.Drawing.SvgContainer", typeof(SvgContainer) }, + {"Greenshot.Editor.Drawing.VectorGraphicsContainer", typeof(VectorGraphicsContainer) }, + {"Greenshot.Editor.Drawing.MetafileContainer", typeof(MetafileContainer) }, + {"Greenshot.Editor.Drawing.ImageContainer", typeof(ImageContainer) }, + {"Greenshot.Editor.Drawing.FilterContainer", typeof(FilterContainer) }, + {"Greenshot.Editor.Drawing.DrawableContainer", typeof(DrawableContainer) }, + {"Greenshot.Editor.Drawing.DrawableContainerList", typeof(DrawableContainerList) }, + {"Greenshot.Editor.Drawing.CursorContainer", typeof(CursorContainer) }, + {"Greenshot.Editor.Drawing.Filters.HighlightFilter", typeof(HighlightFilter) }, + {"Greenshot.Editor.Drawing.Filters.GrayscaleFilter", typeof(GrayscaleFilter) }, + {"Greenshot.Editor.Drawing.Filters.MagnifierFilter", typeof(MagnifierFilter) }, + {"Greenshot.Editor.Drawing.Filters.BrightnessFilter", typeof(BrightnessFilter) }, + {"Greenshot.Editor.Drawing.Filters.BlurFilter", typeof(BlurFilter) }, + {"Greenshot.Editor.Drawing.Filters.PixelizationFilter", typeof(PixelizationFilter) }, + {"Greenshot.Base.Interfaces.Drawing.IDrawableContainer", typeof(IDrawableContainer) }, + {"Greenshot.Base.Interfaces.Drawing.EditStatus", typeof(EditStatus) }, + {"Greenshot.Base.Interfaces.Drawing.IFieldHolder", typeof(IFieldHolder) }, + {"Greenshot.Base.Interfaces.Drawing.IField", typeof(IField) }, + {"Greenshot.Base.Interfaces.Drawing.FieldFlag", typeof(FieldFlag) }, + {"Greenshot.Editor.Drawing.Fields.Field", typeof(Field) }, + {"Greenshot.Editor.Drawing.Fields.FieldType", typeof(FieldType) }, + {"Greenshot.Editor.Drawing.FilterContainer+PreparedFilter", typeof(PreparedFilter) }, + }; + + /// + /// Do the type mapping + /// + /// Assembly for the type that was serialized + /// Type that was serialized + /// Type which was mapped + /// If something smells fishy + public override Type BindToType(string assemblyName, string typeName) + { + if (string.IsNullOrEmpty(typeName)) + { + return null; + } + var typeNameCommaLocation = typeName.IndexOf(","); + var comparingTypeName = typeName.Substring(0, typeNameCommaLocation > 0 ? typeNameCommaLocation : typeName.Length); + + // Correct wrong types + comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing", "Greenshot.Editor.Drawing"); + comparingTypeName = comparingTypeName.Replace("Greenshot.Plugin.Drawing", "Greenshot.Base.Interfaces.Drawing"); + comparingTypeName = comparingTypeName.Replace("GreenshotPlugin.Interfaces.Drawing", "Greenshot.Base.Interfaces.Drawing"); + comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing.Fields", "Greenshot.Editor.Drawing.Fields"); + comparingTypeName = comparingTypeName.Replace("Greenshot.Drawing.Filters", "Greenshot.Editor.Drawing.Filters"); + + if (TypeMapper.TryGetValue(comparingTypeName, out var returnType)) + { + LOG.Info($"Mapped {assemblyName} - {typeName} to {returnType.FullName}"); + return returnType; + } + LOG.Warn($"Unexpected Greenshot type in .greenshot file detected, maybe vulnerability attack created with ysoserial? Suspicious type: {assemblyName} - {typeName}"); + throw new SecurityAccessDeniedException($"Suspicious type in .greenshot file: {assemblyName} - {typeName}"); + } + } +} diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/RegionResult.cs b/src/Greenshot.Editor/Helpers/IDoubleProcessor.cs similarity index 79% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/RegionResult.cs rename to src/Greenshot.Editor/Helpers/IDoubleProcessor.cs index 013f70ef3..beb426c68 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/RegionResult.cs +++ b/src/Greenshot.Editor/Helpers/IDoubleProcessor.cs @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * @@ -19,14 +19,10 @@ * along with this program. If not, see . */ -using System.Diagnostics.CodeAnalysis; - -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Editor.Helpers { - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum RegionResult + public interface IDoubleProcessor { - REGION_ERROR = 0, - REGION_NULLREGION = 1, + double Process(double d); } } \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/ThreadAccess.cs b/src/Greenshot.Editor/Helpers/IHaveScaleOptions.cs similarity index 86% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/ThreadAccess.cs rename to src/Greenshot.Editor/Helpers/IHaveScaleOptions.cs index 415e1f494..3f1ed03ff 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/ThreadAccess.cs +++ b/src/Greenshot.Editor/Helpers/IHaveScaleOptions.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: https://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -19,13 +19,10 @@ * along with this program. If not, see . */ -using System; - -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Editor.Helpers { - [Flags] - public enum ThreadAccess : int + public interface IHaveScaleOptions { - SUSPEND_RESUME = (0x0002), + ScaleOptions GetScaleOptions(); } -} \ No newline at end of file +} diff --git a/src/Greenshot.Base/UnmanagedHelpers/Enums/SendMessageTimeoutFlags.cs b/src/Greenshot.Editor/Helpers/LineAngleRoundBehavior.cs similarity index 72% rename from src/Greenshot.Base/UnmanagedHelpers/Enums/SendMessageTimeoutFlags.cs rename to src/Greenshot.Editor/Helpers/LineAngleRoundBehavior.cs index 64e01979a..6811f66cf 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Enums/SendMessageTimeoutFlags.cs +++ b/src/Greenshot.Editor/Helpers/LineAngleRoundBehavior.cs @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * @@ -20,17 +20,20 @@ */ using System; -using System.Diagnostics.CodeAnalysis; -namespace Greenshot.Base.UnmanagedHelpers.Enums +namespace Greenshot.Editor.Helpers { - /// - /// See: https://www.pinvoke.net/default.aspx/Enums/SendMessageTimeoutFlags.html - /// - [Flags] - [SuppressMessage("ReSharper", "InconsistentNaming")] - public enum SendMessageTimeoutFlags : uint + public class LineAngleRoundBehavior : IDoubleProcessor { - SMTO_NORMAL = 0x0 + public static readonly LineAngleRoundBehavior INSTANCE = new(); + + private LineAngleRoundBehavior() + { + } + + public double Process(double angle) + { + return Math.Round(angle / 15) * 15; + } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Helpers/ScaleHelper.cs b/src/Greenshot.Editor/Helpers/ScaleHelper.cs index 423fdf075..8e4a76a13 100644 --- a/src/Greenshot.Editor/Helpers/ScaleHelper.cs +++ b/src/Greenshot.Editor/Helpers/ScaleHelper.cs @@ -22,6 +22,8 @@ using System; using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Editor.Drawing; namespace Greenshot.Editor.Helpers @@ -31,100 +33,62 @@ namespace Greenshot.Editor.Helpers ///
public static class ScaleHelper { - [Flags] - public enum ScaleOptions - { - /// - /// Default scale behavior. - /// - Default = 0x00, - - /// - /// Scale a rectangle in two our four directions, mirrored at it's center coordinates - /// - Centered = 0x01, - - /// - /// Scale a rectangle maintaining it's aspect ratio - /// - Rational = 0x02 - } - /// /// calculates the Size an element must be resized to, in order to fit another element, keeping aspect ratio /// /// the size of the element to be resized /// the target size of the element /// in case the aspect ratio of currentSize and targetSize differs: shall the scaled size fit into targetSize (i.e. that one of its dimensions is smaller - false) or vice versa (true) - /// a new SizeF object indicating the width and height the element should be scaled to - public static SizeF GetScaledSize(SizeF currentSize, SizeF targetSize, bool crop) + /// NativeSizeFloat object indicating the width and height the element should be scaled to + public static NativeSizeFloat GetScaledSize(NativeSizeFloat currentSize, NativeSizeFloat targetSize, bool crop) { float wFactor = targetSize.Width / currentSize.Width; float hFactor = targetSize.Height / currentSize.Height; float factor = crop ? Math.Max(wFactor, hFactor) : Math.Min(wFactor, hFactor); - return new SizeF(currentSize.Width * factor, currentSize.Height * factor); + return new NativeSizeFloat(currentSize.Width * factor, currentSize.Height * factor); } /// /// calculates the position of an element depending on the desired alignment within a RectangleF /// - /// the bounds of the element to be aligned - /// the rectangle reference for alignment of the element + /// NativeRectFloat the bounds of the element to be aligned + /// NativeRectFloat with the rectangle for alignment of the element /// the System.Drawing.ContentAlignment value indicating how the element is to be aligned should the width or height differ from targetSize - /// a new RectangleF object with Location aligned aligned to targetRect - public static RectangleF GetAlignedRectangle(RectangleF currentRect, RectangleF targetRect, ContentAlignment alignment) + /// NativeRectFloat object with Location aligned aligned to targetRect + public static NativeRectFloat GetAlignedRectangle(NativeRectFloat currentRect, NativeRectFloat targetRect, ContentAlignment alignment) { - RectangleF newRect = new RectangleF(targetRect.Location, currentRect.Size); - switch (alignment) + var newRect = new NativeRectFloat(targetRect.Location, currentRect.Size); + return alignment switch { - case ContentAlignment.TopCenter: - newRect.X = (targetRect.Width - currentRect.Width) / 2; - break; - case ContentAlignment.TopRight: - newRect.X = targetRect.Width - currentRect.Width; - break; - case ContentAlignment.MiddleLeft: - newRect.Y = (targetRect.Height - currentRect.Height) / 2; - break; - case ContentAlignment.MiddleCenter: - newRect.Y = (targetRect.Height - currentRect.Height) / 2; - newRect.X = (targetRect.Width - currentRect.Width) / 2; - break; - case ContentAlignment.MiddleRight: - newRect.Y = (targetRect.Height - currentRect.Height) / 2; - newRect.X = targetRect.Width - currentRect.Width; - break; - case ContentAlignment.BottomLeft: - newRect.Y = targetRect.Height - currentRect.Height; - break; - case ContentAlignment.BottomCenter: - newRect.Y = targetRect.Height - currentRect.Height; - newRect.X = (targetRect.Width - currentRect.Width) / 2; - break; - case ContentAlignment.BottomRight: - newRect.Y = targetRect.Height - currentRect.Height; - newRect.X = targetRect.Width - currentRect.Width; - break; - } - - return newRect; + // TODO: Can ContentAlignment be replaced with Positions? + ContentAlignment.TopCenter => newRect.ChangeX((targetRect.Width - currentRect.Width) / 2), + ContentAlignment.TopRight => newRect.ChangeX(targetRect.Width - currentRect.Width), + ContentAlignment.MiddleLeft => newRect.ChangeY((targetRect.Height - currentRect.Height) / 2), + ContentAlignment.MiddleCenter => newRect.ChangeY((targetRect.Height - currentRect.Height) / 2).ChangeX((targetRect.Width - currentRect.Width) / 2), + ContentAlignment.MiddleRight => newRect.ChangeY((targetRect.Height - currentRect.Height) / 2).ChangeX(targetRect.Width - currentRect.Width), + ContentAlignment.BottomLeft => newRect.ChangeY(targetRect.Height - currentRect.Height), + ContentAlignment.BottomCenter => newRect.ChangeY(targetRect.Height - currentRect.Height).ChangeX((targetRect.Width - currentRect.Width) / 2), + ContentAlignment.BottomRight => newRect.ChangeY(targetRect.Height - currentRect.Height).ChangeX(targetRect.Width - currentRect.Width), + _ => newRect + }; } /// /// Calculates target size of a given rectangle scaled by dragging one of its handles (corners) /// - /// bounds of the current rectangle, scaled values will be written to this reference - /// position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT - /// coordinates of the used handle/gripper + /// NativeRectFloat bounds of the current rectangle + /// Positions with the position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT + /// NativePointFloat coordinates of the used handle/gripper /// ScaleOptions to use when scaling - public static void Scale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords, ScaleOptions? options) + /// NativeRectFloat scaled originalRectangle + public static NativeRectFloat Scale(NativeRectFloat originalRectangle, Positions resizeHandlePosition, NativePointFloat resizeHandleCoords, ScaleOptions? options) { options ??= GetScaleOptions(); if ((options & ScaleOptions.Rational) == ScaleOptions.Rational) { - AdjustCoordsForRationalScale(originalRectangle, resizeHandlePosition, ref resizeHandleCoords); + resizeHandleCoords = AdjustCoordsForRationalScale(originalRectangle, resizeHandlePosition, resizeHandleCoords); } if ((options & ScaleOptions.Centered) == ScaleOptions.Centered) @@ -133,75 +97,40 @@ namespace Greenshot.Editor.Helpers float rectCenterX = originalRectangle.Left + originalRectangle.Width / 2; float rectCenterY = originalRectangle.Top + originalRectangle.Height / 2; // scale rectangle using handle coordinates - Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords); + originalRectangle = Scale(originalRectangle, resizeHandlePosition, resizeHandleCoords); // mirror handle coordinates via rectangle center coordinates - resizeHandleCoords.X -= 2 * (resizeHandleCoords.X - rectCenterX); - resizeHandleCoords.Y -= 2 * (resizeHandleCoords.Y - rectCenterY); + resizeHandleCoords = resizeHandleCoords.Offset(-2 * (resizeHandleCoords.X - rectCenterX), -2 * (resizeHandleCoords.Y - rectCenterY)); // scale again with opposing handle and mirrored coordinates resizeHandlePosition = (Positions) ((((int) resizeHandlePosition) + 4) % 8); - Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords); + originalRectangle = Scale(originalRectangle, resizeHandlePosition, resizeHandleCoords); } else { - Scale(ref originalRectangle, resizeHandlePosition, resizeHandleCoords); + originalRectangle = Scale(originalRectangle, resizeHandlePosition, resizeHandleCoords); } + + return originalRectangle; } /// /// Calculates target size of a given rectangle scaled by dragging one of its handles (corners) /// - /// bounds of the current rectangle, scaled values will be written to this reference - /// position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT - /// coordinates of the used handle/gripper - private static void Scale(ref RectangleF originalRectangle, Positions resizeHandlePosition, PointF resizeHandleCoords) + /// NativeRectFloat bounds of the current rectangle + /// Positions with the position of the handle/gripper being used for resized, see constants in Gripper.cs, e.g. Gripper.POSITION_TOP_LEFT + /// NativePointFloat with coordinates of the used handle/gripper + /// NativeRectFloat with the scaled originalRectangle + private static NativeRectFloat Scale(NativeRectFloat originalRectangle, Positions resizeHandlePosition, NativePointFloat resizeHandleCoords) { - switch (resizeHandlePosition) + return resizeHandlePosition switch { - case Positions.TopLeft: - originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; - originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; - originalRectangle.X = resizeHandleCoords.X; - originalRectangle.Y = resizeHandleCoords.Y; - break; - - case Positions.TopCenter: - originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; - originalRectangle.Y = resizeHandleCoords.Y; - break; - - case Positions.TopRight: - originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; - originalRectangle.Height = originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y; - originalRectangle.Y = resizeHandleCoords.Y; - break; - - case Positions.MiddleLeft: - originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; - originalRectangle.X = resizeHandleCoords.X; - break; - - case Positions.MiddleRight: - originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; - break; - - case Positions.BottomLeft: - originalRectangle.Width = originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X; - originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; - originalRectangle.X = resizeHandleCoords.X; - break; - - case Positions.BottomCenter: - originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; - break; - - case Positions.BottomRight: - originalRectangle.Width = resizeHandleCoords.X - originalRectangle.Left; - originalRectangle.Height = resizeHandleCoords.Y - originalRectangle.Top; - break; - - default: - throw new ArgumentException("Position cannot be handled: " + resizeHandlePosition); - } + Positions.TopLeft => new NativeRectFloat(resizeHandleCoords.X, resizeHandleCoords.Y, originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X, originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y), + Positions.TopCenter => new NativeRectFloat(originalRectangle.X, resizeHandleCoords.Y, originalRectangle.Width, originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y), + Positions.TopRight => new NativeRectFloat(originalRectangle.X, resizeHandleCoords.Y, resizeHandleCoords.X - originalRectangle.Left, originalRectangle.Top + originalRectangle.Height - resizeHandleCoords.Y), + Positions.MiddleLeft => new NativeRectFloat(resizeHandleCoords.X, originalRectangle.Y, originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X, originalRectangle.Height), + Positions.MiddleRight => new NativeRectFloat(originalRectangle.X, originalRectangle.Y, resizeHandleCoords.X - originalRectangle.Left, originalRectangle.Height), Positions.BottomLeft => new NativeRectFloat(resizeHandleCoords.X, originalRectangle.Y, originalRectangle.Left + originalRectangle.Width - resizeHandleCoords.X, resizeHandleCoords.Y - originalRectangle.Top), + Positions.BottomCenter => new NativeRectFloat(originalRectangle.X, originalRectangle.Y, originalRectangle.Width, resizeHandleCoords.Y - originalRectangle.Top), Positions.BottomRight => new NativeRectFloat(originalRectangle.X, originalRectangle.Y, resizeHandleCoords.X - originalRectangle.Left, resizeHandleCoords.Y - originalRectangle.Top), + _ => throw new ArgumentException("Position cannot be handled: " + resizeHandlePosition) + }; } /// @@ -210,43 +139,42 @@ namespace Greenshot.Editor.Helpers /// To avoid objects growing near infinity unexpectedly in certain combinations, the adjustment will choose the /// option resulting in the smaller rectangle. /// - /// bounds of the current rectangle - /// position of the handle/gripper being used for resized, see Position - /// coordinates of the used handle/gripper, adjusted coordinates will be written to this reference - private static void AdjustCoordsForRationalScale(RectangleF originalRectangle, Positions resizeHandlePosition, ref PointF resizeHandleCoords) + /// NativeRectFloat with the bounds of the current rectangle + /// Positions with the position of the handle/gripper being used for resized, see Position + /// NativePointFloat with coordinates of the used handle/gripper + /// NativePointFloat with the adjusted coordinates + private static NativePointFloat AdjustCoordsForRationalScale(NativeRectFloat originalRectangle, Positions resizeHandlePosition, NativePointFloat resizeHandleCoords) { - SizeF selectedRectangle, newSize; + NativeSizeFloat selectedRectangle, newSize; switch (resizeHandlePosition) { case Positions.TopLeft: - selectedRectangle = new SizeF(originalRectangle.Right - resizeHandleCoords.X, originalRectangle.Bottom - resizeHandleCoords.Y); + selectedRectangle = new NativeSizeFloat(originalRectangle.Right - resizeHandleCoords.X, originalRectangle.Bottom - resizeHandleCoords.Y); newSize = GetNewSizeForRationalScale(originalRectangle.Size, selectedRectangle); - resizeHandleCoords.X = originalRectangle.Right - newSize.Width; - resizeHandleCoords.Y = originalRectangle.Bottom - newSize.Height; + resizeHandleCoords = new NativePointFloat(originalRectangle.Right - newSize.Width, originalRectangle.Bottom - newSize.Height); break; case Positions.TopRight: - selectedRectangle = new SizeF(resizeHandleCoords.X - originalRectangle.Left, originalRectangle.Bottom - resizeHandleCoords.Y); + selectedRectangle = new NativeSizeFloat(resizeHandleCoords.X - originalRectangle.Left, originalRectangle.Bottom - resizeHandleCoords.Y); newSize = GetNewSizeForRationalScale(originalRectangle.Size, selectedRectangle); - resizeHandleCoords.X = originalRectangle.Left + newSize.Width; - resizeHandleCoords.Y = originalRectangle.Bottom - newSize.Height; + resizeHandleCoords = new NativePointFloat(originalRectangle.Left + newSize.Width, originalRectangle.Bottom - newSize.Height); break; case Positions.BottomLeft: - selectedRectangle = new SizeF(originalRectangle.Right - resizeHandleCoords.X, resizeHandleCoords.Y - originalRectangle.Top); + selectedRectangle = new NativeSizeFloat(originalRectangle.Right - resizeHandleCoords.X, resizeHandleCoords.Y - originalRectangle.Top); newSize = GetNewSizeForRationalScale(originalRectangle.Size, selectedRectangle); - resizeHandleCoords.X = originalRectangle.Right - newSize.Width; - resizeHandleCoords.Y = originalRectangle.Top + newSize.Height; + resizeHandleCoords = new NativePointFloat(originalRectangle.Right - newSize.Width, originalRectangle.Top + newSize.Height); break; case Positions.BottomRight: - selectedRectangle = new SizeF(resizeHandleCoords.X - originalRectangle.Left, resizeHandleCoords.Y - originalRectangle.Top); + selectedRectangle = new NativeSizeFloat(resizeHandleCoords.X - originalRectangle.Left, resizeHandleCoords.Y - originalRectangle.Top); newSize = GetNewSizeForRationalScale(originalRectangle.Size, selectedRectangle); - resizeHandleCoords.X = originalRectangle.Left + newSize.Width; - resizeHandleCoords.Y = originalRectangle.Top + newSize.Height; + resizeHandleCoords = new NativePointFloat(originalRectangle.Left + newSize.Width, originalRectangle.Top + newSize.Height); break; } + + return resizeHandleCoords; } /// @@ -254,12 +182,12 @@ namespace Greenshot.Editor.Helpers /// * has the same aspect ratio as the original /// * fits into selected size /// - /// size to be considered for keeping aspect ratio - /// selection size (i.e. the size we'd produce if we wouldn't keep aspect ratio) - /// - private static SizeF GetNewSizeForRationalScale(SizeF originalSize, SizeF selectedSize) + /// NativeSizeFloat to be considered for keeping aspect ratio + /// NativeSizeFloat selection size (i.e. the size we'd produce if we wouldn't keep aspect ratio) + /// NativeSizeFloat + private static NativeSizeFloat GetNewSizeForRationalScale(NativeSizeFloat originalSize, NativeSizeFloat selectedSize) { - SizeF newSize = selectedSize; + NativeSizeFloat newSize = selectedSize; float originalRatio = originalSize.Width / originalSize.Height; float selectedRatio = selectedSize.Width / selectedSize.Height; // will fix orientation if the scaling causes size to be flipped in any direction @@ -268,35 +196,34 @@ namespace Greenshot.Editor.Helpers { // scaled rectangle (ratio) would be wider than original // keep height and tweak width to maintain aspect ratio - newSize.Width = selectedSize.Height * originalRatio * flippedRatioSign; + newSize = newSize.ChangeWidth(selectedSize.Height * originalRatio * flippedRatioSign); } else if (Math.Abs(selectedRatio) < Math.Abs(originalRatio)) { // scaled rectangle (ratio) would be taller than original // keep width and tweak height to maintain aspect ratio - newSize.Height = selectedSize.Width / originalRatio * flippedRatioSign; + newSize = newSize.ChangeHeight(selectedSize.Width / originalRatio * flippedRatioSign); } return newSize; } - public static void Scale(Rectangle boundsBeforeResize, int cursorX, int cursorY, ref RectangleF boundsAfterResize) + /// + /// Scale the boundsBeforeResize with the specified position and new location, using the angle angleRoundBehavior + /// + /// NativeRect + /// int + /// int + /// IDoubleProcessor + /// ScaleOptions + /// NativeRectFloat + public static NativeRectFloat Scale(NativeRect boundsBeforeResize, int cursorX, int cursorY, IDoubleProcessor angleRoundBehavior, ScaleOptions? scaleOptions = null) { - Scale(boundsBeforeResize, cursorX, cursorY, ref boundsAfterResize, null); - } + scaleOptions ??= GetScaleOptions(); - public static void Scale(Rectangle boundsBeforeResize, int cursorX, int cursorY, ref RectangleF boundsAfterResize, IDoubleProcessor angleRoundBehavior) - { - Scale(boundsBeforeResize, Positions.TopLeft, cursorX, cursorY, ref boundsAfterResize, angleRoundBehavior); - } - - public static void Scale(Rectangle boundsBeforeResize, Positions gripperPosition, int cursorX, int cursorY, ref RectangleF boundsAfterResize, - IDoubleProcessor angleRoundBehavior) - { - ScaleOptions opts = GetScaleOptions(); - - bool rationalScale = (opts & ScaleOptions.Rational) == ScaleOptions.Rational; - bool centeredScale = (opts & ScaleOptions.Centered) == ScaleOptions.Centered; + NativeRectFloat result = boundsBeforeResize; + bool rationalScale = (scaleOptions & ScaleOptions.Rational) == ScaleOptions.Rational; + bool centeredScale = (scaleOptions & ScaleOptions.Centered) == ScaleOptions.Centered; if (rationalScale) { @@ -309,19 +236,19 @@ namespace Greenshot.Editor.Helpers int dist = GeometryHelper.Distance2D(boundsBeforeResize.X, boundsBeforeResize.Y, cursorX, cursorY); - boundsAfterResize.Width = (int) Math.Round(dist * Math.Cos(angle / 180 * Math.PI)); - boundsAfterResize.Height = (int) Math.Round(dist * Math.Sin(angle / 180 * Math.PI)); + result = result + .ChangeWidth((int)Math.Round(dist * Math.Cos(angle / 180 * Math.PI))) + .ChangeHeight((int) Math.Round(dist * Math.Sin(angle / 180 * Math.PI))); } if (centeredScale) { - float wdiff = boundsAfterResize.Width - boundsBeforeResize.Width; - float hdiff = boundsAfterResize.Height - boundsBeforeResize.Height; - boundsAfterResize.Width += wdiff; - boundsAfterResize.Height += hdiff; - boundsAfterResize.X -= wdiff; - boundsAfterResize.Y -= hdiff; + float wdiff = result.Width - result.Width; + float hdiff = result.Height - result.Height; + result = result.Inflate(wdiff, hdiff); } + + return result; } /// the current ScaleOptions depending on modifier keys held down @@ -334,38 +261,5 @@ namespace Greenshot.Editor.Helpers if (maintainAspectRatio) opts |= ScaleOptions.Rational; return opts; } - - public interface IDoubleProcessor - { - double Process(double d); - } - - public class ShapeAngleRoundBehavior : IDoubleProcessor - { - public static ShapeAngleRoundBehavior Instance = new(); - - private ShapeAngleRoundBehavior() - { - } - - public double Process(double angle) - { - return Math.Round((angle + 45) / 90) * 90 - 45; - } - } - - public class LineAngleRoundBehavior : IDoubleProcessor - { - public static LineAngleRoundBehavior Instance = new(); - - private LineAngleRoundBehavior() - { - } - - public double Process(double angle) - { - return Math.Round(angle / 15) * 15; - } - } } } \ No newline at end of file diff --git a/src/Greenshot.Base/UnmanagedHelpers/WinMM.cs b/src/Greenshot.Editor/Helpers/ScaleOptions.cs similarity index 66% rename from src/Greenshot.Base/UnmanagedHelpers/WinMM.cs rename to src/Greenshot.Editor/Helpers/ScaleOptions.cs index bee586bda..1f47f5c02 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/WinMM.cs +++ b/src/Greenshot.Editor/Helpers/ScaleOptions.cs @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * @@ -20,19 +20,25 @@ */ using System; -using System.Runtime.InteropServices; -namespace Greenshot.Base.UnmanagedHelpers +namespace Greenshot.Editor.Helpers { - /// - /// Windows Media - /// - public class WinMM + [Flags] + public enum ScaleOptions { - [DllImport("winmm.dll", SetLastError = true)] - public static extern bool PlaySound(byte[] ptrToSound, UIntPtr hmod, uint fdwSound); + /// + /// Default scale behavior. + /// + Default = 0x00, - [DllImport("winmm.dll", SetLastError = true)] - public static extern bool PlaySound(IntPtr ptrToSound, UIntPtr hmod, uint fdwSound); + /// + /// Scale a rectangle in two our four directions, mirrored at it's center coordinates + /// + Centered = 0x01, + + /// + /// Scale a rectangle maintaining it's aspect ratio + /// + Rational = 0x02 } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Helpers/ShapeAngleRoundBehavior.cs b/src/Greenshot.Editor/Helpers/ShapeAngleRoundBehavior.cs new file mode 100644 index 000000000..ba173df9f --- /dev/null +++ b/src/Greenshot.Editor/Helpers/ShapeAngleRoundBehavior.cs @@ -0,0 +1,39 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; + +namespace Greenshot.Editor.Helpers +{ + public class ShapeAngleRoundBehavior : IDoubleProcessor + { + public static readonly ShapeAngleRoundBehavior INSTANCE = new(); + + private ShapeAngleRoundBehavior() + { + } + + public double Process(double angle) + { + return Math.Round((angle + 45) / 90) * 90 - 45; + } + } +} \ No newline at end of file diff --git a/src/Greenshot.Editor/Memento/AddElementMemento.cs b/src/Greenshot.Editor/Memento/AddElementMemento.cs index dbee523a6..b76858780 100644 --- a/src/Greenshot.Editor/Memento/AddElementMemento.cs +++ b/src/Greenshot.Editor/Memento/AddElementMemento.cs @@ -20,9 +20,8 @@ */ using System; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing; - namespace Greenshot.Editor.Memento { /// @@ -31,9 +30,9 @@ namespace Greenshot.Editor.Memento public class AddElementMemento : IMemento { private IDrawableContainer _drawableContainer; - private Surface _surface; + private ISurface _surface; - public AddElementMemento(Surface surface, IDrawableContainer drawableContainer) + public AddElementMemento(ISurface surface, IDrawableContainer drawableContainer) { _surface = surface; _drawableContainer = drawableContainer; @@ -45,7 +44,7 @@ namespace Greenshot.Editor.Memento GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { //if (disposing) { } _drawableContainer = null; diff --git a/src/Greenshot.Editor/Memento/AddElementsMemento.cs b/src/Greenshot.Editor/Memento/AddElementsMemento.cs index 80c9d3d99..0b11fac15 100644 --- a/src/Greenshot.Editor/Memento/AddElementsMemento.cs +++ b/src/Greenshot.Editor/Memento/AddElementsMemento.cs @@ -19,8 +19,8 @@ * along with this program. If not, see . */ +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing; namespace Greenshot.Editor.Memento { @@ -30,9 +30,9 @@ namespace Greenshot.Editor.Memento public class AddElementsMemento : IMemento { private IDrawableContainerList _containerList; - private Surface _surface; + private ISurface _surface; - public AddElementsMemento(Surface surface, IDrawableContainerList containerList) + public AddElementsMemento(ISurface surface, IDrawableContainerList containerList) { _surface = surface; _containerList = containerList; @@ -43,7 +43,7 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { diff --git a/src/Greenshot.Editor/Memento/ChangeFieldHolderMemento.cs b/src/Greenshot.Editor/Memento/ChangeFieldHolderMemento.cs index 1ffa8c16e..70dba9252 100644 --- a/src/Greenshot.Editor/Memento/ChangeFieldHolderMemento.cs +++ b/src/Greenshot.Editor/Memento/ChangeFieldHolderMemento.cs @@ -44,7 +44,7 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { diff --git a/src/Greenshot.Editor/Memento/DeleteElementMemento.cs b/src/Greenshot.Editor/Memento/DeleteElementMemento.cs index ade27b23a..1d744239d 100644 --- a/src/Greenshot.Editor/Memento/DeleteElementMemento.cs +++ b/src/Greenshot.Editor/Memento/DeleteElementMemento.cs @@ -20,8 +20,8 @@ */ using System; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing; namespace Greenshot.Editor.Memento { @@ -31,9 +31,9 @@ namespace Greenshot.Editor.Memento public class DeleteElementMemento : IMemento { private IDrawableContainer _drawableContainer; - private readonly Surface _surface; + private readonly ISurface _surface; - public DeleteElementMemento(Surface surface, IDrawableContainer drawableContainer) + public DeleteElementMemento(ISurface surface, IDrawableContainer drawableContainer) { _surface = surface; _drawableContainer = drawableContainer; @@ -45,7 +45,7 @@ namespace Greenshot.Editor.Memento GC.SuppressFinalize(this); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (!disposing) return; diff --git a/src/Greenshot.Editor/Memento/DeleteElementsMemento.cs b/src/Greenshot.Editor/Memento/DeleteElementsMemento.cs index d4d4a3be1..509bbb016 100644 --- a/src/Greenshot.Editor/Memento/DeleteElementsMemento.cs +++ b/src/Greenshot.Editor/Memento/DeleteElementsMemento.cs @@ -19,8 +19,8 @@ * along with this program. If not, see . */ +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing; namespace Greenshot.Editor.Memento { @@ -30,9 +30,9 @@ namespace Greenshot.Editor.Memento public class DeleteElementsMemento : IMemento { private IDrawableContainerList _containerList; - private Surface _surface; + private ISurface _surface; - public DeleteElementsMemento(Surface surface, IDrawableContainerList containerList) + public DeleteElementsMemento(ISurface surface, IDrawableContainerList containerList) { _surface = surface; _containerList = containerList; @@ -43,7 +43,7 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { diff --git a/src/Greenshot.Editor/Memento/DrawableContainerBoundsChangeMemento.cs b/src/Greenshot.Editor/Memento/DrawableContainerBoundsChangeMemento.cs index 428b0ff3d..b5b97e4cf 100644 --- a/src/Greenshot.Editor/Memento/DrawableContainerBoundsChangeMemento.cs +++ b/src/Greenshot.Editor/Memento/DrawableContainerBoundsChangeMemento.cs @@ -34,30 +34,30 @@ namespace Greenshot.Editor.Memento { private readonly List _points = new(); private readonly List _sizes = new(); - private IDrawableContainerList _listOfdrawableContainer; + private IDrawableContainerList _listOfDrawableContainer; private void StoreBounds() { - foreach (IDrawableContainer drawableContainer in _listOfdrawableContainer) + foreach (IDrawableContainer drawableContainer in _listOfDrawableContainer) { _points.Add(drawableContainer.Location); _sizes.Add(drawableContainer.Size); } } - public DrawableContainerBoundsChangeMemento(IDrawableContainerList listOfdrawableContainer) + public DrawableContainerBoundsChangeMemento(IDrawableContainerList listOfDrawableContainer) { - _listOfdrawableContainer = listOfdrawableContainer; + _listOfDrawableContainer = listOfDrawableContainer; StoreBounds(); } public DrawableContainerBoundsChangeMemento(IDrawableContainer drawableContainer) { - _listOfdrawableContainer = new DrawableContainerList + _listOfDrawableContainer = new DrawableContainerList { drawableContainer }; - _listOfdrawableContainer.Parent = drawableContainer.Parent; + _listOfDrawableContainer.Parent = drawableContainer.Parent; StoreBounds(); } @@ -66,21 +66,21 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { - _listOfdrawableContainer?.Dispose(); + _listOfDrawableContainer?.Dispose(); } - _listOfdrawableContainer = null; + _listOfDrawableContainer = null; } public bool Merge(IMemento otherMemento) { if (otherMemento is not DrawableContainerBoundsChangeMemento other) return false; - if (ObjectExtensions.CompareLists(_listOfdrawableContainer, other._listOfdrawableContainer)) + if (ObjectExtensions.CompareLists(_listOfDrawableContainer, other._listOfDrawableContainer)) { // Lists are equal, as we have the state already we can ignore the new memento return true; @@ -91,10 +91,10 @@ namespace Greenshot.Editor.Memento public IMemento Restore() { - var oldState = new DrawableContainerBoundsChangeMemento(_listOfdrawableContainer); - for (int index = 0; index < _listOfdrawableContainer.Count; index++) + var oldState = new DrawableContainerBoundsChangeMemento(_listOfDrawableContainer); + for (int index = 0; index < _listOfDrawableContainer.Count; index++) { - IDrawableContainer drawableContainer = _listOfdrawableContainer[index]; + IDrawableContainer drawableContainer = _listOfDrawableContainer[index]; // Before drawableContainer.Invalidate(); drawableContainer.Left = _points[index].X; diff --git a/src/Greenshot.Editor/Memento/SurfaceBackgroundChangeMemento.cs b/src/Greenshot.Editor/Memento/SurfaceBackgroundChangeMemento.cs index 71d2e9f36..8c49614b4 100644 --- a/src/Greenshot.Editor/Memento/SurfaceBackgroundChangeMemento.cs +++ b/src/Greenshot.Editor/Memento/SurfaceBackgroundChangeMemento.cs @@ -21,8 +21,8 @@ using System.Drawing; using System.Drawing.Drawing2D; +using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; -using Greenshot.Editor.Drawing; namespace Greenshot.Editor.Memento { @@ -32,10 +32,10 @@ namespace Greenshot.Editor.Memento public class SurfaceBackgroundChangeMemento : IMemento { private Image _image; - private Surface _surface; + private ISurface _surface; private Matrix _matrix; - public SurfaceBackgroundChangeMemento(Surface surface, Matrix matrix) + public SurfaceBackgroundChangeMemento(ISurface surface, Matrix matrix) { _surface = surface; _image = surface.Image; @@ -52,7 +52,7 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (!disposing) return; diff --git a/src/Greenshot.Editor/Memento/TextChangeMemento.cs b/src/Greenshot.Editor/Memento/TextChangeMemento.cs index 411dde53c..46f33592b 100644 --- a/src/Greenshot.Editor/Memento/TextChangeMemento.cs +++ b/src/Greenshot.Editor/Memento/TextChangeMemento.cs @@ -43,7 +43,7 @@ namespace Greenshot.Editor.Memento Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { diff --git a/src/Greenshot.Editor/Resources/AutoCrop.Image.png b/src/Greenshot.Editor/Resources/AutoCrop.Image.png new file mode 100644 index 000000000..1f9d86c4d Binary files /dev/null and b/src/Greenshot.Editor/Resources/AutoCrop.Image.png differ diff --git a/src/Greenshot.Editor/Resources/CropHorizontal.Image.png b/src/Greenshot.Editor/Resources/CropHorizontal.Image.png new file mode 100644 index 000000000..f8f321c15 Binary files /dev/null and b/src/Greenshot.Editor/Resources/CropHorizontal.Image.png differ diff --git a/src/Greenshot.Editor/Resources/CropVertical.Image.png b/src/Greenshot.Editor/Resources/CropVertical.Image.png new file mode 100644 index 000000000..fe1dea06e Binary files /dev/null and b/src/Greenshot.Editor/Resources/CropVertical.Image.png differ diff --git a/src/Greenshot.Plugin.Box/BoxConfiguration.cs b/src/Greenshot.Plugin.Box/BoxConfiguration.cs index 34ae4afc9..c745fe985 100644 --- a/src/Greenshot.Plugin.Box/BoxConfiguration.cs +++ b/src/Greenshot.Plugin.Box/BoxConfiguration.cs @@ -76,5 +76,20 @@ namespace Greenshot.Plugin.Box return false; } + + /// + /// Upgrade certain values + /// + public override void AfterLoad() + { + var coreConfiguration = IniConfig.GetIniSection(); + bool isUpgradeFrom12 = coreConfiguration.LastSaveWithVersion?.StartsWith("1.2") ?? false; + // Clear token when we upgrade from 1.2 to 1.3 as it is no longer valid, discussed in #421 + if (!isUpgradeFrom12) return; + + // We have an upgrade, remove all previous credentials. + RefreshToken = null; + AccessToken = null; + } } } \ No newline at end of file diff --git a/src/Greenshot.Plugin.Box/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Box/Forms/SettingsForm.Designer.cs index de492dde4..940eaccb6 100644 --- a/src/Greenshot.Plugin.Box/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Box/Forms/SettingsForm.Designer.cs @@ -87,7 +87,7 @@ namespace Greenshot.Plugin.Box.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(208, 12); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(BoxConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Box"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(215, 21); this.combobox_uploadimageformat.TabIndex = 5; @@ -115,7 +115,7 @@ namespace Greenshot.Plugin.Box.Forms { this.checkboxAfterUploadLinkToClipBoard.LanguageKey = "box.label_AfterUploadLinkToClipBoard"; this.checkboxAfterUploadLinkToClipBoard.Location = new System.Drawing.Point(208, 45); this.checkboxAfterUploadLinkToClipBoard.Name = "checkboxAfterUploadLinkToClipBoard"; - this.checkboxAfterUploadLinkToClipBoard.PropertyName = "AfterUploadLinkToClipBoard"; + this.checkboxAfterUploadLinkToClipBoard.PropertyName = nameof(BoxConfiguration.AfterUploadLinkToClipBoard); this.checkboxAfterUploadLinkToClipBoard.SectionName = "Box"; this.checkboxAfterUploadLinkToClipBoard.Size = new System.Drawing.Size(104, 17); this.checkboxAfterUploadLinkToClipBoard.TabIndex = 10; diff --git a/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.Credentials.template b/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.Credentials.template index df6eaa0bd..da2dbc7ae 100644 --- a/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.Credentials.template +++ b/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.Credentials.template @@ -1,4 +1,4 @@ -/* +/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom * diff --git a/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.csproj b/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.csproj index fced869ad..2b3410c8f 100644 --- a/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.csproj +++ b/src/Greenshot.Plugin.Box/Greenshot.Plugin.Box.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs index 2ffb6f6fd..0379e4a65 100644 --- a/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Box/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to Box")] +[assembly: AssemblyPluginIdentifier("Box Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Confluence/ConfluenceConfiguration.cs b/src/Greenshot.Plugin.Confluence/ConfluenceConfiguration.cs index f2212126d..8176ebe6e 100644 --- a/src/Greenshot.Plugin.Confluence/ConfluenceConfiguration.cs +++ b/src/Greenshot.Plugin.Confluence/ConfluenceConfiguration.cs @@ -20,7 +20,6 @@ */ using System; -using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; diff --git a/src/Greenshot.Plugin.Confluence/ConfluenceDestination.cs b/src/Greenshot.Plugin.Confluence/ConfluenceDestination.cs index ddcb66530..669087901 100644 --- a/src/Greenshot.Plugin.Confluence/ConfluenceDestination.cs +++ b/src/Greenshot.Plugin.Confluence/ConfluenceDestination.cs @@ -54,8 +54,8 @@ namespace Greenshot.Plugin.Confluence Uri confluenceIconUri = new Uri("/Greenshot.Plugin.Confluence;component/Images/Confluence.ico", UriKind.Relative); using (Stream iconStream = Application.GetResourceStream(confluenceIconUri)?.Stream) { - // TODO: Check what to do with the IImage - ConfluenceIcon = ImageHelper.FromStream(iconStream); + // TODO: Replace with FileFormatHandler + ConfluenceIcon = ImageIO.FromStream(iconStream); } IsInitialized = true; diff --git a/src/Greenshot.Plugin.Confluence/Greenshot.Plugin.Confluence.csproj b/src/Greenshot.Plugin.Confluence/Greenshot.Plugin.Confluence.csproj index d885ea3f5..0734c44e9 100644 --- a/src/Greenshot.Plugin.Confluence/Greenshot.Plugin.Confluence.csproj +++ b/src/Greenshot.Plugin.Confluence/Greenshot.Plugin.Confluence.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/SIZE.cs b/src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs similarity index 62% rename from src/Greenshot.Base/UnmanagedHelpers/Structs/SIZE.cs rename to src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs index a5a59b63f..8d2833e17 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/SIZE.cs +++ b/src/Greenshot.Plugin.Confluence/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel * * For more information see: https://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot @@ -19,33 +19,16 @@ * along with this program. If not, see . */ -using System; -using System.Drawing; +using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - [StructLayout(LayoutKind.Sequential), Serializable()] - public struct SIZE - { - public int Width; - public int Height; +// 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: AssemblyDescription("A plugin to upload images to Confluence")] +[assembly: AssemblyPluginIdentifier("Confluence Plugin")] - public SIZE(Size size) : this(size.Width, size.Height) - { - } - - public SIZE(int width, int height) - { - Width = width; - Height = height; - } - - public Size ToSize() - { - return new Size(Width, Height); - } - - public bool IsEmpty => Width * Height == 0; - } -} \ No newline at end of file +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Confluence/Support/TranslationManager.cs b/src/Greenshot.Plugin.Confluence/Support/TranslationManager.cs index 825d1aae7..944269625 100644 --- a/src/Greenshot.Plugin.Confluence/Support/TranslationManager.cs +++ b/src/Greenshot.Plugin.Confluence/Support/TranslationManager.cs @@ -8,25 +8,6 @@ namespace Greenshot.Plugin.Confluence.Support public event EventHandler LanguageChanged; - /*public CultureInfo CurrentLanguage { - get { return Thread.CurrentThread.CurrentUICulture; } - set { - if( value != Thread.CurrentThread.CurrentUICulture) { - Thread.CurrentThread.CurrentUICulture = value; - OnLanguageChanged(); - } - } - } - - public IEnumerable Languages { - get { - if( TranslationProvider != null) { - return TranslationProvider.Languages; - } - return Enumerable.Empty(); - } - }*/ - public static TranslationManager Instance => _translationManager ??= new TranslationManager(); public ITranslationProvider TranslationProvider { get; set; } diff --git a/src/Greenshot.Plugin.Dropbox/DropboxPluginConfiguration.cs b/src/Greenshot.Plugin.Dropbox/DropboxConfiguration.cs similarity index 79% rename from src/Greenshot.Plugin.Dropbox/DropboxPluginConfiguration.cs rename to src/Greenshot.Plugin.Dropbox/DropboxConfiguration.cs index 996b964f0..d79db8686 100644 --- a/src/Greenshot.Plugin.Dropbox/DropboxPluginConfiguration.cs +++ b/src/Greenshot.Plugin.Dropbox/DropboxConfiguration.cs @@ -1,74 +1,89 @@ -/* - * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel - * - * For more information see: https://getgreenshot.org/ - * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 1 of the License, or - * (at your option) any later version. - * - * 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Windows.Forms; -using Greenshot.Base.Core; -using Greenshot.Base.Core.Enums; -using Greenshot.Base.IniFile; -using Greenshot.Plugin.Dropbox.Forms; - -namespace Greenshot.Plugin.Dropbox -{ - /// - /// Description of ImgurConfiguration. - /// - [IniSection("Dropbox", Description = "Greenshot Dropbox Plugin configuration")] - public class DropboxPluginConfiguration : IniSection - { - [IniProperty("UploadFormat", Description = "What file type to use for uploading", DefaultValue = "png")] - public OutputFormat UploadFormat { get; set; } - - [IniProperty("UploadJpegQuality", Description = "JPEG file save quality in %.", DefaultValue = "80")] - public int UploadJpegQuality { get; set; } - - [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send Dropbox link to clipboard.", DefaultValue = "true")] - public bool AfterUploadLinkToClipBoard { get; set; } - - [IniProperty("RefreshToken", Description = "Dropbox refresh Token", Encrypted = true, ExcludeIfNull = true)] - public string RefreshToken { get; set; } - - /// - /// AccessToken, not stored - /// - public string AccessToken { get; set; } - - /// - /// AccessTokenExpires, not stored - /// - public DateTimeOffset AccessTokenExpires { get; set; } - - /// - /// A form for token - /// - /// bool true if OK was pressed, false if cancel - public bool ShowConfigDialog() - { - DialogResult result = new SettingsForm().ShowDialog(); - if (result == DialogResult.OK) - { - return true; - } - - return false; - } - } +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System; +using System.Windows.Forms; +using Greenshot.Base.Core; +using Greenshot.Base.Core.Enums; +using Greenshot.Base.IniFile; +using Greenshot.Plugin.Dropbox.Forms; + +namespace Greenshot.Plugin.Dropbox +{ + /// + /// The configuration for Dropbox + /// + [IniSection("Dropbox", Description = "Greenshot Dropbox Plugin configuration")] + public class DropboxConfiguration : IniSection + { + [IniProperty("UploadFormat", Description = "What file type to use for uploading", DefaultValue = "png")] + public OutputFormat UploadFormat { get; set; } + + [IniProperty("UploadJpegQuality", Description = "JPEG file save quality in %.", DefaultValue = "80")] + public int UploadJpegQuality { get; set; } + + [IniProperty("AfterUploadLinkToClipBoard", Description = "After upload send Dropbox link to clipboard.", DefaultValue = "true")] + public bool AfterUploadLinkToClipBoard { get; set; } + + [IniProperty("RefreshToken", Description = "Dropbox refresh Token", Encrypted = true, ExcludeIfNull = true)] + public string RefreshToken { get; set; } + + /// + /// AccessToken, not stored + /// + public string AccessToken { get; set; } + + /// + /// AccessTokenExpires, not stored + /// + public DateTimeOffset AccessTokenExpires { get; set; } + + /// + /// A form for token + /// + /// bool true if OK was pressed, false if cancel + public bool ShowConfigDialog() + { + DialogResult result = new SettingsForm().ShowDialog(); + if (result == DialogResult.OK) + { + return true; + } + + return false; + } + + /// + /// Upgrade certain values + /// + public override void AfterLoad() + { + var coreConfiguration = IniConfig.GetIniSection(); + bool isUpgradeFrom12 = coreConfiguration.LastSaveWithVersion?.StartsWith("1.2") ?? false; + // Clear token when we upgrade from 1.2 to 1.3 as it is no longer valid, discussed in #421 + if (!isUpgradeFrom12) return; + + // We have an upgrade, remove all previous credentials. + RefreshToken = null; + AccessToken = null; + } + } } \ No newline at end of file diff --git a/src/Greenshot.Plugin.Dropbox/DropboxDestination.cs b/src/Greenshot.Plugin.Dropbox/DropboxDestination.cs index 59f6c45b1..d29c3cbd0 100644 --- a/src/Greenshot.Plugin.Dropbox/DropboxDestination.cs +++ b/src/Greenshot.Plugin.Dropbox/DropboxDestination.cs @@ -29,7 +29,7 @@ namespace Greenshot.Plugin.Dropbox { internal class DropboxDestination : AbstractDestination { - private static readonly DropboxPluginConfiguration DropboxConfig = IniConfig.GetIniSection(); + private static readonly DropboxConfiguration DropboxConfig = IniConfig.GetIniSection(); private readonly DropboxPlugin _plugin; diff --git a/src/Greenshot.Plugin.Dropbox/DropboxPlugin.cs b/src/Greenshot.Plugin.Dropbox/DropboxPlugin.cs index 9a82b0f40..69026066c 100644 --- a/src/Greenshot.Plugin.Dropbox/DropboxPlugin.cs +++ b/src/Greenshot.Plugin.Dropbox/DropboxPlugin.cs @@ -37,7 +37,7 @@ namespace Greenshot.Plugin.Dropbox public class DropboxPlugin : IGreenshotPlugin { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(DropboxPlugin)); - private static DropboxPluginConfiguration _config; + private static DropboxConfiguration _config; private ComponentResourceManager _resources; private ToolStripMenuItem _itemPlugInConfig; @@ -71,7 +71,7 @@ namespace Greenshot.Plugin.Dropbox public bool Initialize() { // Register configuration (don't need the configuration itself) - _config = IniConfig.GetIniSection(); + _config = IniConfig.GetIniSection(); _resources = new ComponentResourceManager(typeof(DropboxPlugin)); SimpleServiceProvider.Current.AddService(new DropboxDestination(this)); _itemPlugInConfig = new ToolStripMenuItem diff --git a/src/Greenshot.Plugin.Dropbox/DropboxUtils.cs b/src/Greenshot.Plugin.Dropbox/DropboxUtils.cs index 4b5eb4d60..c7f6dcfe9 100644 --- a/src/Greenshot.Plugin.Dropbox/DropboxUtils.cs +++ b/src/Greenshot.Plugin.Dropbox/DropboxUtils.cs @@ -37,7 +37,7 @@ namespace Greenshot.Plugin.Dropbox public class DropboxUtils { private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(DropboxUtils)); - private static readonly DropboxPluginConfiguration DropboxConfig = IniConfig.GetIniSection(); + private static readonly DropboxConfiguration DropboxConfig = IniConfig.GetIniSection(); private DropboxUtils() { diff --git a/src/Greenshot.Plugin.Dropbox/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Dropbox/Forms/SettingsForm.Designer.cs index 174342a90..e65cba1ec 100644 --- a/src/Greenshot.Plugin.Dropbox/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Dropbox/Forms/SettingsForm.Designer.cs @@ -86,7 +86,7 @@ namespace Greenshot.Plugin.Dropbox.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(116, 9); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(DropboxConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Dropbox"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(309, 21); this.combobox_uploadimageformat.TabIndex = 1; @@ -112,7 +112,7 @@ namespace Greenshot.Plugin.Dropbox.Forms { this.checkboxAfterUploadLinkToClipBoard.LanguageKey = "dropbox.label_AfterUploadLinkToClipBoard"; this.checkboxAfterUploadLinkToClipBoard.Location = new System.Drawing.Point(116, 37); this.checkboxAfterUploadLinkToClipBoard.Name = "checkboxAfterUploadLinkToClipBoard"; - this.checkboxAfterUploadLinkToClipBoard.PropertyName = "AfterUploadLinkToClipBoard"; + this.checkboxAfterUploadLinkToClipBoard.PropertyName = nameof(DropboxConfiguration.AfterUploadLinkToClipBoard); this.checkboxAfterUploadLinkToClipBoard.SectionName = "Dropbox"; this.checkboxAfterUploadLinkToClipBoard.Size = new System.Drawing.Size(104, 17); this.checkboxAfterUploadLinkToClipBoard.TabIndex = 2; diff --git a/src/Greenshot.Plugin.Dropbox/Greenshot.Plugin.Dropbox.csproj b/src/Greenshot.Plugin.Dropbox/Greenshot.Plugin.Dropbox.csproj index 09eb988a5..7437b64aa 100644 --- a/src/Greenshot.Plugin.Dropbox/Greenshot.Plugin.Dropbox.csproj +++ b/src/Greenshot.Plugin.Dropbox/Greenshot.Plugin.Dropbox.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs index d01359e25..b95b9af6d 100644 --- a/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Dropbox/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to Dropbox")] +[assembly: AssemblyPluginIdentifier("Dropbox Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.ExternalCommand/ExternalCommandDestination.cs b/src/Greenshot.Plugin.ExternalCommand/ExternalCommandDestination.cs index 273535952..4083827e3 100644 --- a/src/Greenshot.Plugin.ExternalCommand/ExternalCommandDestination.cs +++ b/src/Greenshot.Plugin.ExternalCommand/ExternalCommandDestination.cs @@ -77,7 +77,7 @@ namespace Greenshot.Plugin.ExternalCommand } bool runInBackground = config.RunInbackground[_presetCommand]; - string fullPath = captureDetails.Filename ?? ImageOutput.SaveNamedTmpFile(surface, captureDetails, outputSettings); + string fullPath = captureDetails.Filename ?? ImageIO.SaveNamedTmpFile(surface, captureDetails, outputSettings); string output; string error; diff --git a/src/Greenshot.Plugin.ExternalCommand/Greenshot.Plugin.ExternalCommand.csproj b/src/Greenshot.Plugin.ExternalCommand/Greenshot.Plugin.ExternalCommand.csproj index 50e39b62a..d0151b7c0 100644 --- a/src/Greenshot.Plugin.ExternalCommand/Greenshot.Plugin.ExternalCommand.csproj +++ b/src/Greenshot.Plugin.ExternalCommand/Greenshot.Plugin.ExternalCommand.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..acbe80370 --- /dev/null +++ b/src/Greenshot.Plugin.ExternalCommand/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; +using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; + +// 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: AssemblyDescription("A plugin to send screenshots to other applications")] +[assembly: AssemblyPluginIdentifier("External command Plugin")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Flickr/FlickrConfiguration.cs b/src/Greenshot.Plugin.Flickr/FlickrConfiguration.cs index 8eedbf768..df5a428fa 100644 --- a/src/Greenshot.Plugin.Flickr/FlickrConfiguration.cs +++ b/src/Greenshot.Plugin.Flickr/FlickrConfiguration.cs @@ -87,5 +87,21 @@ namespace Greenshot.Plugin.Flickr return false; } + + /// + /// Upgrade certain values + /// + public override void AfterLoad() + { + var coreConfiguration = IniConfig.GetIniSection(); + bool isUpgradeFrom12 = coreConfiguration.LastSaveWithVersion?.StartsWith("1.2") ?? false; + // Clear token when we upgrade from 1.2 to 1.3 as it is no longer valid, discussed in #421 + if (!isUpgradeFrom12) return; + + // We have an upgrade, remove all previous credentials. + FlickrToken = null; + FlickrTokenSecret = null; + } + } } \ No newline at end of file diff --git a/src/Greenshot.Plugin.Flickr/FlickrPlugin.cs b/src/Greenshot.Plugin.Flickr/FlickrPlugin.cs index 1939fba22..dcad49473 100644 --- a/src/Greenshot.Plugin.Flickr/FlickrPlugin.cs +++ b/src/Greenshot.Plugin.Flickr/FlickrPlugin.cs @@ -30,7 +30,6 @@ using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Plugin; using log4net; -using log4net.Config; namespace Greenshot.Plugin.Flickr { diff --git a/src/Greenshot.Plugin.Flickr/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Flickr/Forms/SettingsForm.Designer.cs index 46549f943..5eed52b57 100644 --- a/src/Greenshot.Plugin.Flickr/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Flickr/Forms/SettingsForm.Designer.cs @@ -93,7 +93,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(174, 6); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(FlickrConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Flickr"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(251, 21); this.combobox_uploadimageformat.TabIndex = 1; @@ -111,7 +111,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.checkBoxPublic.LanguageKey = "flickr.public"; this.checkBoxPublic.Location = new System.Drawing.Point(174, 88); this.checkBoxPublic.Name = "checkBoxPublic"; - this.checkBoxPublic.PropertyName = "flickrIsPublic"; + this.checkBoxPublic.PropertyName = nameof(FlickrConfiguration.IsPublic); this.checkBoxPublic.SectionName = "Flickr"; this.checkBoxPublic.Size = new System.Drawing.Size(55, 17); this.checkBoxPublic.TabIndex = 4; @@ -122,7 +122,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.checkBoxFamily.LanguageKey = "flickr.family"; this.checkBoxFamily.Location = new System.Drawing.Point(265, 88); this.checkBoxFamily.Name = "checkBoxFamily"; - this.checkBoxFamily.PropertyName = "flickrIsFamily"; + this.checkBoxFamily.PropertyName = nameof(FlickrConfiguration.IsFamily); this.checkBoxFamily.SectionName = "Flickr"; this.checkBoxFamily.Size = new System.Drawing.Size(55, 17); this.checkBoxFamily.TabIndex = 5; @@ -133,7 +133,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.checkBoxFriend.LanguageKey = "flickr.friend"; this.checkBoxFriend.Location = new System.Drawing.Point(350, 88); this.checkBoxFriend.Name = "checkBoxFriend"; - this.checkBoxFriend.PropertyName = "flickrIsFriend"; + this.checkBoxFriend.PropertyName = nameof(FlickrConfiguration.IsFriend); this.checkBoxFriend.SectionName = "Flickr"; this.checkBoxFriend.Size = new System.Drawing.Size(55, 17); this.checkBoxFriend.TabIndex = 6; @@ -155,7 +155,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.combobox_safetyLevel.FormattingEnabled = true; this.combobox_safetyLevel.Location = new System.Drawing.Point(174, 33); this.combobox_safetyLevel.Name = "combobox_safetyLevel"; - this.combobox_safetyLevel.PropertyName = "SafetyLevel"; + this.combobox_safetyLevel.PropertyName = nameof(FlickrConfiguration.SafetyLevel); this.combobox_safetyLevel.SectionName = "Flickr"; this.combobox_safetyLevel.Size = new System.Drawing.Size(251, 21); this.combobox_safetyLevel.TabIndex = 2; @@ -173,7 +173,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.checkboxAfterUploadLinkToClipBoard.LanguageKey = "flickr.label_AfterUploadLinkToClipBoard"; this.checkboxAfterUploadLinkToClipBoard.Location = new System.Drawing.Point(173, 116); this.checkboxAfterUploadLinkToClipBoard.Name = "checkboxAfterUploadLinkToClipBoard"; - this.checkboxAfterUploadLinkToClipBoard.PropertyName = "AfterUploadLinkToClipBoard"; + this.checkboxAfterUploadLinkToClipBoard.PropertyName = nameof(FlickrConfiguration.AfterUploadLinkToClipBoard); this.checkboxAfterUploadLinkToClipBoard.SectionName = "Flickr"; this.checkboxAfterUploadLinkToClipBoard.Size = new System.Drawing.Size(104, 17); this.checkboxAfterUploadLinkToClipBoard.TabIndex = 7; @@ -184,7 +184,7 @@ namespace Greenshot.Plugin.Flickr.Forms { this.checkBox_hiddenfromsearch.LanguageKey = "flickr.label_HiddenFromSearch"; this.checkBox_hiddenfromsearch.Location = new System.Drawing.Point(174, 60); this.checkBox_hiddenfromsearch.Name = "checkBox_hiddenfromsearch"; - this.checkBox_hiddenfromsearch.PropertyName = "HiddenFromSearch"; + this.checkBox_hiddenfromsearch.PropertyName = nameof(FlickrConfiguration.HiddenFromSearch); this.checkBox_hiddenfromsearch.SectionName = "Flickr"; this.checkBox_hiddenfromsearch.Size = new System.Drawing.Size(118, 17); this.checkBox_hiddenfromsearch.TabIndex = 3; diff --git a/src/Greenshot.Plugin.Flickr/Greenshot.Plugin.Flickr.csproj b/src/Greenshot.Plugin.Flickr/Greenshot.Plugin.Flickr.csproj index 5bc629bf1..8bdb8bcb4 100644 --- a/src/Greenshot.Plugin.Flickr/Greenshot.Plugin.Flickr.csproj +++ b/src/Greenshot.Plugin.Flickr/Greenshot.Plugin.Flickr.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs index 30eafc83e..9701ef654 100644 --- a/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Flickr/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to Flickr")] +[assembly: AssemblyPluginIdentifier("Flickr Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.GooglePhotos/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.GooglePhotos/Forms/SettingsForm.Designer.cs index 7b0325981..23e68012f 100644 --- a/src/Greenshot.Plugin.GooglePhotos/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.GooglePhotos/Forms/SettingsForm.Designer.cs @@ -86,7 +86,7 @@ namespace Greenshot.Plugin.GooglePhotos.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(197, 12); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(GooglePhotosConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "GooglePhotos"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(225, 21); this.combobox_uploadimageformat.TabIndex = 1; @@ -114,7 +114,7 @@ namespace Greenshot.Plugin.GooglePhotos.Forms { this.checkboxAfterUploadLinkToClipBoard.LanguageKey = "googlephotos.label_AfterUploadLinkToClipBoard"; this.checkboxAfterUploadLinkToClipBoard.Location = new System.Drawing.Point(197, 50); this.checkboxAfterUploadLinkToClipBoard.Name = "checkboxAfterUploadLinkToClipBoard"; - this.checkboxAfterUploadLinkToClipBoard.PropertyName = "AfterUploadLinkToClipBoard"; + this.checkboxAfterUploadLinkToClipBoard.PropertyName = nameof(GooglePhotosConfiguration.AfterUploadLinkToClipBoard); this.checkboxAfterUploadLinkToClipBoard.SectionName = "GooglePhotos"; this.checkboxAfterUploadLinkToClipBoard.Size = new System.Drawing.Size(104, 17); this.checkboxAfterUploadLinkToClipBoard.TabIndex = 2; diff --git a/src/Greenshot.Plugin.GooglePhotos/GooglePhotosConfiguration.cs b/src/Greenshot.Plugin.GooglePhotos/GooglePhotosConfiguration.cs index 91892f136..5765544b9 100644 --- a/src/Greenshot.Plugin.GooglePhotos/GooglePhotosConfiguration.cs +++ b/src/Greenshot.Plugin.GooglePhotos/GooglePhotosConfiguration.cs @@ -20,7 +20,6 @@ using System; using System.Windows.Forms; -using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; using Greenshot.Plugin.GooglePhotos.Forms; diff --git a/src/Greenshot.Plugin.GooglePhotos/Greenshot.Plugin.GooglePhotos.csproj b/src/Greenshot.Plugin.GooglePhotos/Greenshot.Plugin.GooglePhotos.csproj index f2bfb8be5..154410dd2 100644 --- a/src/Greenshot.Plugin.GooglePhotos/Greenshot.Plugin.GooglePhotos.csproj +++ b/src/Greenshot.Plugin.GooglePhotos/Greenshot.Plugin.GooglePhotos.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs index a49045818..3ff014500 100644 --- a/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.GooglePhotos/Properties/AssemblyInfo.cs @@ -21,12 +21,17 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to GooglePhotos")] +// Still using the old name 'Picasa-Web Plugin' as identifier for backwards compatibility +// TODO: replace plugin identifier with "GooglePhotos Plugin" in the future +[assembly: AssemblyPluginIdentifier("Picasa-Web Plugin")] + // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. [assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Imgur/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Imgur/Forms/SettingsForm.Designer.cs index f40ee6460..1b9b52c42 100644 --- a/src/Greenshot.Plugin.Imgur/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Imgur/Forms/SettingsForm.Designer.cs @@ -86,7 +86,7 @@ namespace Greenshot.Plugin.Imgur.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(168, 7); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(ImgurConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Imgur"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(210, 21); this.combobox_uploadimageformat.TabIndex = 1; @@ -115,7 +115,7 @@ namespace Greenshot.Plugin.Imgur.Forms { this.checkbox_anonymous_access.LanguageKey = "imgur.anonymous_access"; this.checkbox_anonymous_access.Location = new System.Drawing.Point(15, 38); this.checkbox_anonymous_access.Name = "checkbox_anonymous_access"; - this.checkbox_anonymous_access.PropertyName = "AnonymousAccess"; + this.checkbox_anonymous_access.PropertyName = nameof(ImgurConfiguration.AnonymousAccess); this.checkbox_anonymous_access.SectionName = "Imgur"; this.checkbox_anonymous_access.Size = new System.Drawing.Size(139, 17); this.checkbox_anonymous_access.TabIndex = 2; @@ -126,7 +126,7 @@ namespace Greenshot.Plugin.Imgur.Forms { this.checkbox_usepagelink.LanguageKey = "imgur.use_page_link"; this.checkbox_usepagelink.Location = new System.Drawing.Point(15, 57); this.checkbox_usepagelink.Name = "checkbox_usepagelink"; - this.checkbox_usepagelink.PropertyName = "UsePageLink"; + this.checkbox_usepagelink.PropertyName = nameof(ImgurConfiguration.UsePageLink); this.checkbox_usepagelink.SectionName = "Imgur"; this.checkbox_usepagelink.Size = new System.Drawing.Size(251, 17); this.checkbox_usepagelink.TabIndex = 3; diff --git a/src/Greenshot.Plugin.Imgur/Greenshot.Plugin.Imgur.csproj b/src/Greenshot.Plugin.Imgur/Greenshot.Plugin.Imgur.csproj index e0696e270..5cb8e0baa 100644 --- a/src/Greenshot.Plugin.Imgur/Greenshot.Plugin.Imgur.csproj +++ b/src/Greenshot.Plugin.Imgur/Greenshot.Plugin.Imgur.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Imgur/ImgurConfiguration.cs b/src/Greenshot.Plugin.Imgur/ImgurConfiguration.cs index 7635ee3de..3dc145d0b 100644 --- a/src/Greenshot.Plugin.Imgur/ImgurConfiguration.cs +++ b/src/Greenshot.Plugin.Imgur/ImgurConfiguration.cs @@ -85,6 +85,22 @@ namespace Greenshot.Plugin.Imgur public Dictionary runtimeImgurHistory = new Dictionary(); public int Credits { get; set; } + /// + /// Upgrade certain values + /// + public override void AfterLoad() + { + var coreConfiguration = IniConfig.GetIniSection(); + bool isUpgradeFrom12 = coreConfiguration.LastSaveWithVersion?.StartsWith("1.2") ?? false; + // Clear token when we upgrade from 1.2 to 1.3 as it is no longer valid, discussed in #421 + if (!isUpgradeFrom12) return; + + // We have an upgrade, remove all previous credentials. + AccessToken = null; + RefreshToken = null; + AccessTokenExpires = default; + } + /// /// Supply values we can't put as defaults /// @@ -93,7 +109,7 @@ namespace Greenshot.Plugin.Imgur public override object GetDefault(string property) => property switch { - "ImgurUploadHistory" => new Dictionary(), + nameof(ImgurUploadHistory) => new Dictionary(), _ => null }; diff --git a/src/Greenshot.Plugin.Imgur/ImgurUtils.cs b/src/Greenshot.Plugin.Imgur/ImgurUtils.cs index a2156d6d0..02af34e56 100644 --- a/src/Greenshot.Plugin.Imgur/ImgurUtils.cs +++ b/src/Greenshot.Plugin.Imgur/ImgurUtils.cs @@ -179,7 +179,7 @@ namespace Greenshot.Plugin.Imgur { using (var requestStream = webRequest.GetRequestStream()) { - ImageOutput.SaveToStream(surfaceToUpload, requestStream, outputSettings); + ImageIO.SaveToStream(surfaceToUpload, requestStream, outputSettings); } using WebResponse response = webRequest.GetResponse(); @@ -265,7 +265,8 @@ namespace Greenshot.Plugin.Imgur Stream responseStream = response.GetResponseStream(); if (responseStream != null) { - imgurInfo.Image = ImageHelper.FromStream(responseStream); + // TODO: Replace with some other code, like the file format handler + imgurInfo.Image = ImageIO.FromStream(responseStream); } } diff --git a/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs index befa881fd..4f9d4afb5 100644 --- a/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Imgur/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to Imgur")] +[assembly: AssemblyPluginIdentifier("Imgur Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Jira/Forms/JiraForm.cs b/src/Greenshot.Plugin.Jira/Forms/JiraForm.cs index 5830eb1dc..29b75e9bb 100644 --- a/src/Greenshot.Plugin.Jira/Forms/JiraForm.cs +++ b/src/Greenshot.Plugin.Jira/Forms/JiraForm.cs @@ -26,6 +26,7 @@ using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using Dapplo.Jira.Entities; +using Dapplo.Windows.Dpi; using Greenshot.Base.Controls; using Greenshot.Base.Core; using Greenshot.Base.IniFile; @@ -173,7 +174,7 @@ namespace Greenshot.Plugin.Jira.Forms jiraListView.Columns.Add(translation); } - var scaledIconSize = DpiHelper.ScaleWithDpi(CoreConfig.IconSize, DpiHelper.GetDpi(Handle)); + var scaledIconSize = DpiCalculator.ScaleWithDpi(CoreConfig.IconSize, NativeDpiMethods.GetDpi(Handle)); var imageList = new ImageList { ImageSize = scaledIconSize diff --git a/src/Greenshot.Plugin.Jira/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Jira/Forms/SettingsForm.Designer.cs index 945abe034..6903f74fd 100644 --- a/src/Greenshot.Plugin.Jira/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Jira/Forms/SettingsForm.Designer.cs @@ -94,7 +94,7 @@ namespace Greenshot.Plugin.Jira.Forms { this.textBoxUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.textBoxUrl.Location = new System.Drawing.Point(164, 21); this.textBoxUrl.Name = "textBoxUrl"; - this.textBoxUrl.PropertyName = "Url"; + this.textBoxUrl.PropertyName = nameof(JiraConfiguration.Url); this.textBoxUrl.SectionName = "Jira"; this.textBoxUrl.Size = new System.Drawing.Size(214, 20); this.textBoxUrl.TabIndex = 6; @@ -105,7 +105,7 @@ namespace Greenshot.Plugin.Jira.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(164, 47); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(JiraConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Jira"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(214, 21); this.combobox_uploadimageformat.TabIndex = 8; diff --git a/src/Greenshot.Plugin.Jira/Greenshot.Plugin.Jira.csproj b/src/Greenshot.Plugin.Jira/Greenshot.Plugin.Jira.csproj index e75002ed7..d38eb063a 100644 --- a/src/Greenshot.Plugin.Jira/Greenshot.Plugin.Jira.csproj +++ b/src/Greenshot.Plugin.Jira/Greenshot.Plugin.Jira.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest @@ -6,7 +10,7 @@ - - + + \ No newline at end of file diff --git a/src/Greenshot.Plugin.Jira/JiraConfiguration.cs b/src/Greenshot.Plugin.Jira/JiraConfiguration.cs index 069cc3263..7163924c5 100644 --- a/src/Greenshot.Plugin.Jira/JiraConfiguration.cs +++ b/src/Greenshot.Plugin.Jira/JiraConfiguration.cs @@ -19,7 +19,6 @@ * along with this program. If not, see . */ -using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; diff --git a/src/Greenshot.Plugin.Jira/JiraConnector.cs b/src/Greenshot.Plugin.Jira/JiraConnector.cs index ad48a09fa..fbfd42543 100644 --- a/src/Greenshot.Plugin.Jira/JiraConnector.cs +++ b/src/Greenshot.Plugin.Jira/JiraConnector.cs @@ -63,8 +63,8 @@ namespace Greenshot.Plugin.Jira var jiraConnector = SimpleServiceProvider.Current.GetInstance(); jiraConnector._jiraClient?.Behaviour.SetConfig(new SvgConfiguration { - Width = CoreConfig.ScaledIconSize.Width, - Height = CoreConfig.ScaledIconSize.Height + Width = CoreConfig.IconSize.Width, + Height = CoreConfig.IconSize.Height }); } }; @@ -112,8 +112,8 @@ namespace Greenshot.Plugin.Jira _jiraClient = JiraClient.Create(new Uri(JiraConfig.Url)); _jiraClient.Behaviour.SetConfig(new SvgConfiguration { - Width = CoreConfig.ScaledIconSize.Width, - Height = CoreConfig.ScaledIconSize.Height + Width = CoreConfig.IconSize.Width, + Height = CoreConfig.IconSize.Height }); _jiraClient.SetBasicAuthentication(user, password); diff --git a/src/Greenshot.Plugin.Jira/JiraMonitor.cs b/src/Greenshot.Plugin.Jira/JiraMonitor.cs index 17cc20d16..81a62b759 100644 --- a/src/Greenshot.Plugin.Jira/JiraMonitor.cs +++ b/src/Greenshot.Plugin.Jira/JiraMonitor.cs @@ -27,7 +27,9 @@ using System.Threading; using System.Threading.Tasks; using Dapplo.Jira; using Dapplo.Log; -using Greenshot.Base.Hooking; +using Dapplo.Windows.Desktop; +using Dapplo.Windows.Structs; +using Dapplo.Windows.User32; namespace Greenshot.Plugin.Jira { @@ -40,7 +42,7 @@ namespace Greenshot.Plugin.Jira { private static readonly LogSource Log = new LogSource(); private readonly Regex _jiraKeyPattern = new Regex(@"[A-Z][A-Z0-9]+\-[0-9]+"); - private readonly WindowsTitleMonitor _monitor; + private readonly IDisposable _monitor; private readonly IList _jiraInstances = new List(); private readonly IDictionary _projectJiraClientMap = new Dictionary(); @@ -56,9 +58,8 @@ namespace Greenshot.Plugin.Jira public JiraMonitor(int maxEntries = 40) { + _monitor = WinEventHook.WindowTitleChangeObservable().Subscribe(wei => MonitorTitleChangeEvent(wei)); _maxEntries = maxEntries; - _monitor = new WindowsTitleMonitor(); - _monitor.TitleChangeEvent += MonitorTitleChangeEvent; } /// @@ -82,7 +83,6 @@ namespace Greenshot.Plugin.Jira } // free managed resources - _monitor.TitleChangeEvent -= MonitorTitleChangeEvent; _monitor.Dispose(); // free native resources if there are any. } @@ -162,10 +162,10 @@ namespace Greenshot.Plugin.Jira /// /// Handle title changes, check for JIRA /// - /// - private void MonitorTitleChangeEvent(TitleChangeEventArgs eventArgs) + /// WinEventInfo + private void MonitorTitleChangeEvent(WinEventInfo winEventInfo) { - string windowTitle = eventArgs.Title; + string windowTitle = User32Api.GetText(winEventInfo.Handle); if (string.IsNullOrEmpty(windowTitle)) { return; diff --git a/src/Greenshot.Base/UnmanagedHelpers/Structs/IconInfo.cs b/src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs similarity index 57% rename from src/Greenshot.Base/UnmanagedHelpers/Structs/IconInfo.cs rename to src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs index 470862304..44f8800ce 100644 --- a/src/Greenshot.Base/UnmanagedHelpers/Structs/IconInfo.cs +++ b/src/Greenshot.Plugin.Jira/Properties/AssemblyInfo.cs @@ -1,36 +1,34 @@ /* * Greenshot - a free and open source screenshot tool - * Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom - * + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom, Francis Noel + * * For more information see: https://getgreenshot.org/ * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 1 of the License, or * (at your option) any later version. - * + * * 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 General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -using System; +using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; -namespace Greenshot.Base.UnmanagedHelpers.Structs -{ - [StructLayout(LayoutKind.Sequential)] - public struct IconInfo - { - public bool fIcon; - public int xHotspot; - public int yHotspot; - public IntPtr hbmMask; - public IntPtr hbmColor; - } -} \ No newline at end of file +// 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: AssemblyDescription("A plugin to upload images to Jira")] +[assembly: AssemblyPluginIdentifier("Jira Plugin")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/src/Greenshot.Plugin.Office/Com/Ole32Api.cs b/src/Greenshot.Plugin.Office/Com/Ole32Api.cs index 07d807ee2..1a57aa6c9 100644 --- a/src/Greenshot.Plugin.Office/Com/Ole32Api.cs +++ b/src/Greenshot.Plugin.Office/Com/Ole32Api.cs @@ -3,8 +3,8 @@ using System; using System.Runtime.InteropServices; -using Greenshot.Base.Core; -using Greenshot.Base.Core.Enums; +using Dapplo.Windows.Common.Enums; +using Dapplo.Windows.Common.Extensions; namespace Greenshot.Plugin.Office.Com { diff --git a/src/Greenshot.Plugin.Office/Com/OleAut32Api.cs b/src/Greenshot.Plugin.Office/Com/OleAut32Api.cs index c32b11a19..ea0f1b0c9 100644 --- a/src/Greenshot.Plugin.Office/Com/OleAut32Api.cs +++ b/src/Greenshot.Plugin.Office/Com/OleAut32Api.cs @@ -3,8 +3,8 @@ using System; using System.Runtime.InteropServices; -using Greenshot.Base.Core; -using Greenshot.Base.Core.Enums; +using Dapplo.Windows.Common.Enums; +using Dapplo.Windows.Common.Extensions; namespace Greenshot.Plugin.Office.Com { diff --git a/src/Greenshot.Plugin.Office/Destinations/ExcelDestination.cs b/src/Greenshot.Plugin.Office/Destinations/ExcelDestination.cs index cf09272e2..1a671cf7a 100644 --- a/src/Greenshot.Plugin.Office/Destinations/ExcelDestination.cs +++ b/src/Greenshot.Plugin.Office/Destinations/ExcelDestination.cs @@ -42,7 +42,8 @@ namespace Greenshot.Plugin.Office.Destinations static ExcelDestination() { - ExePath = PluginUtils.GetExePath("EXCEL.EXE"); + ExePath = OfficeUtils.GetOfficeExePath("EXCEL.EXE") ?? PluginUtils.GetExePath("EXCEL.EXE"); + if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("excel"); @@ -89,7 +90,7 @@ namespace Greenshot.Plugin.Office.Destinations string imageFile = captureDetails.Filename; if (imageFile == null || surface.Modified || !Regex.IsMatch(imageFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { - imageFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); + imageFile = ImageIO.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); createdFile = true; } @@ -107,7 +108,7 @@ namespace Greenshot.Plugin.Office.Destinations // Cleanup imageFile if we created it here, so less tmp-files are generated and left if (createdFile) { - ImageOutput.DeleteNamedTmpFile(imageFile); + ImageIO.DeleteNamedTmpFile(imageFile); } return exportInformation; diff --git a/src/Greenshot.Plugin.Office/Destinations/OneNoteDestination.cs b/src/Greenshot.Plugin.Office/Destinations/OneNoteDestination.cs index 387810494..5f8da7a67 100644 --- a/src/Greenshot.Plugin.Office/Destinations/OneNoteDestination.cs +++ b/src/Greenshot.Plugin.Office/Destinations/OneNoteDestination.cs @@ -41,7 +41,7 @@ namespace Greenshot.Plugin.Office.Destinations static OneNoteDestination() { - exePath = PluginUtils.GetExePath("ONENOTE.EXE"); + exePath = OfficeUtils.GetOfficeExePath("ONENOTE.EXE") ?? PluginUtils.GetExePath("ONENOTE.EXE"); if (exePath != null && File.Exists(exePath)) { WindowDetails.AddProcessToExcludeFromFreeze("onenote"); diff --git a/src/Greenshot.Plugin.Office/Destinations/OutlookDestination.cs b/src/Greenshot.Plugin.Office/Destinations/OutlookDestination.cs index da694be62..3c77ea4f1 100644 --- a/src/Greenshot.Plugin.Office/Destinations/OutlookDestination.cs +++ b/src/Greenshot.Plugin.Office/Destinations/OutlookDestination.cs @@ -58,8 +58,7 @@ namespace Greenshot.Plugin.Office.Destinations { IsActiveFlag = true; } - - ExePath = PluginUtils.GetExePath("OUTLOOK.EXE"); + ExePath = OfficeUtils.GetOfficeExePath("OUTLOOK.EXE") ?? PluginUtils.GetExePath("OUTLOOK.EXE"); if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("outlook"); @@ -160,7 +159,7 @@ namespace Greenshot.Plugin.Office.Destinations string tmpFile = captureDetails.Filename; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { - tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); + tmpFile = ImageIO.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); } else { diff --git a/src/Greenshot.Plugin.Office/Destinations/PowerpointDestination.cs b/src/Greenshot.Plugin.Office/Destinations/PowerpointDestination.cs index a151d3388..010093027 100644 --- a/src/Greenshot.Plugin.Office/Destinations/PowerpointDestination.cs +++ b/src/Greenshot.Plugin.Office/Destinations/PowerpointDestination.cs @@ -45,7 +45,7 @@ namespace Greenshot.Plugin.Office.Destinations static PowerpointDestination() { - ExePath = PluginUtils.GetExePath("POWERPNT.EXE"); + ExePath = OfficeUtils.GetOfficeExePath("POWERPNT.EXE") ?? PluginUtils.GetExePath("POWERPNT.EXE"); if (ExePath != null && File.Exists(ExePath)) { WindowDetails.AddProcessToExcludeFromFreeze("powerpnt"); @@ -114,7 +114,7 @@ namespace Greenshot.Plugin.Office.Destinations Size imageSize = Size.Empty; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { - tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); + tmpFile = ImageIO.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); imageSize = surface.Image.Size; } diff --git a/src/Greenshot.Plugin.Office/Destinations/WordDestination.cs b/src/Greenshot.Plugin.Office/Destinations/WordDestination.cs index fd91295be..d6220a302 100644 --- a/src/Greenshot.Plugin.Office/Destinations/WordDestination.cs +++ b/src/Greenshot.Plugin.Office/Destinations/WordDestination.cs @@ -46,7 +46,7 @@ namespace Greenshot.Plugin.Office.Destinations static WordDestination() { - ExePath = PluginUtils.GetExePath("WINWORD.EXE"); + ExePath = OfficeUtils.GetOfficeExePath("WINWORD.EXE") ?? PluginUtils.GetExePath("WINWORD.EXE"); if (ExePath != null && !File.Exists(ExePath)) { ExePath = null; @@ -88,7 +88,7 @@ namespace Greenshot.Plugin.Office.Destinations string tmpFile = captureDetails.Filename; if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$")) { - tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); + tmpFile = ImageIO.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat()); } if (_documentCaption != null) @@ -118,7 +118,7 @@ namespace Greenshot.Plugin.Office.Destinations if (!manuallyInitiated) { var documents = _wordExporter.GetWordDocuments().ToList(); - if (documents != null && documents.Count > 0) + if (documents is { Count: > 0 }) { var destinations = new List { diff --git a/src/Greenshot.Plugin.Office/Greenshot.Plugin.Office.csproj b/src/Greenshot.Plugin.Office/Greenshot.Plugin.Office.csproj index fdb555adc..982b86833 100644 --- a/src/Greenshot.Plugin.Office/Greenshot.Plugin.Office.csproj +++ b/src/Greenshot.Plugin.Office/Greenshot.Plugin.Office.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest @@ -78,23 +82,23 @@ - + true runtime - + true runtime - + true runtime - + true runtime - + true runtime diff --git a/src/Greenshot.Plugin.Office/OfficeExport/ExcelExporter.cs b/src/Greenshot.Plugin.Office/OfficeExport/ExcelExporter.cs index 48b7d994b..cfffff5f6 100644 --- a/src/Greenshot.Plugin.Office/OfficeExport/ExcelExporter.cs +++ b/src/Greenshot.Plugin.Office/OfficeExport/ExcelExporter.cs @@ -20,7 +20,7 @@ using System; using System.Collections.Generic; using System.Drawing; -using Greenshot.Base.UnmanagedHelpers; +using Dapplo.Windows.User32; using Greenshot.Plugin.Office.Com; using Greenshot.Plugin.Office.OfficeInterop; using Microsoft.Office.Core; @@ -177,7 +177,7 @@ namespace Greenshot.Plugin.Office.OfficeExport shape.ComObject.ScaleWidth(1, MsoTriState.msoTrue, MsoScaleFrom.msoScaleFromTopLeft); workbook.ComObject.Activate(); using var application = DisposableCom.Create(workbook.ComObject.Application); - User32.SetForegroundWindow((IntPtr) application.ComObject.Hwnd); + User32Api.SetForegroundWindow((IntPtr) application.ComObject.Hwnd); } /// diff --git a/src/Greenshot.Plugin.Office/OfficeExport/OneNoteExporter.cs b/src/Greenshot.Plugin.Office/OfficeExport/OneNoteExporter.cs index 305888ee2..645623780 100644 --- a/src/Greenshot.Plugin.Office/OfficeExport/OneNoteExporter.cs +++ b/src/Greenshot.Plugin.Office/OfficeExport/OneNoteExporter.cs @@ -97,7 +97,7 @@ namespace Greenshot.Plugin.Office.OfficeExport using var pngStream = new MemoryStream(); var pngOutputSettings = new SurfaceOutputSettings(OutputFormat.png, 100, false); - ImageOutput.SaveToStream(surfaceToUpload, pngStream, pngOutputSettings); + ImageIO.SaveToStream(surfaceToUpload, pngStream, pngOutputSettings); var base64String = Convert.ToBase64String(pngStream.GetBuffer()); var imageXmlStr = string.Format(XmlImageContent, base64String, surfaceToUpload.Image.Width, surfaceToUpload.Image.Height); var pageChangesXml = string.Format(XmlOutline, imageXmlStr, page.Id, OnenoteNamespace2010, page.Name); diff --git a/src/Greenshot.Plugin.Office/OfficeUtils.cs b/src/Greenshot.Plugin.Office/OfficeUtils.cs new file mode 100644 index 000000000..305611c5d --- /dev/null +++ b/src/Greenshot.Plugin.Office/OfficeUtils.cs @@ -0,0 +1,45 @@ +using System.Linq; +using Microsoft.Win32; + +namespace Greenshot.Plugin.Office +{ + + /// + /// A small utility class for helping with office + /// + internal static class OfficeUtils + { + private static readonly string[] OfficeRootKeys = { @"SOFTWARE\Microsoft\Office", @"SOFTWARE\WOW6432Node\Microsoft\Office" }; + + /// + /// Get the path to the office exe + /// + /// Name of the office executable + public static string GetOfficeExePath(string exeName) + { + string strKeyName = exeName switch + { + "WINWORD.EXE" => "Word", + "EXCEL.EXE" => "Excel", + "POWERPNT.EXE" => "PowerPoint", + "OUTLOOK.EXE" => "Outlook", + "ONENOTE.EXE" => "OneNote", + _ => "" + }; + + foreach (string strRootKey in OfficeRootKeys) + { + using RegistryKey rootKey = Registry.LocalMachine.OpenSubKey(strRootKey); + if (rootKey is null) continue; + + foreach (string officeVersion in rootKey.GetSubKeyNames().Where(r => r.Contains(".")).Reverse()) + { + using RegistryKey installRootKey = Registry.LocalMachine.OpenSubKey($@"{strRootKey}\{officeVersion}\{strKeyName}\InstallRoot"); + if (installRootKey == null) continue; + return $@"{installRootKey.GetValue("Path")}\{exeName}"; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs index 9dcc75892..6b14a40f5 100644 --- a/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Office/Properties/AssemblyInfo.cs @@ -21,11 +21,13 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to export images to Office applications")] +[assembly: AssemblyPluginIdentifier("Office Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Photobucket/Forms/SettingsForm.Designer.cs b/src/Greenshot.Plugin.Photobucket/Forms/SettingsForm.Designer.cs index 9376f693e..1fff9f5c3 100644 --- a/src/Greenshot.Plugin.Photobucket/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot.Plugin.Photobucket/Forms/SettingsForm.Designer.cs @@ -84,7 +84,7 @@ namespace Greenshot.Plugin.Photobucket.Forms { this.combobox_uploadimageformat.FormattingEnabled = true; this.combobox_uploadimageformat.Location = new System.Drawing.Point(102, 11); this.combobox_uploadimageformat.Name = "combobox_uploadimageformat"; - this.combobox_uploadimageformat.PropertyName = "UploadFormat"; + this.combobox_uploadimageformat.PropertyName = nameof(PhotobucketConfiguration.UploadFormat); this.combobox_uploadimageformat.SectionName = "Photobucket"; this.combobox_uploadimageformat.Size = new System.Drawing.Size(276, 21); this.combobox_uploadimageformat.TabIndex = 1; @@ -102,7 +102,7 @@ namespace Greenshot.Plugin.Photobucket.Forms { this.checkbox_usepagelink.LanguageKey = "photobucket.use_page_link"; this.checkbox_usepagelink.Location = new System.Drawing.Point(15, 43); this.checkbox_usepagelink.Name = "checkbox_usepagelink"; - this.checkbox_usepagelink.PropertyName = "UsePageLink"; + this.checkbox_usepagelink.PropertyName = nameof(PhotobucketConfiguration.UsePageLink); this.checkbox_usepagelink.SectionName = "Photobucket"; this.checkbox_usepagelink.Size = new System.Drawing.Size(251, 17); this.checkbox_usepagelink.TabIndex = 2; diff --git a/src/Greenshot.Plugin.Photobucket/Greenshot.Plugin.Photobucket.csproj b/src/Greenshot.Plugin.Photobucket/Greenshot.Plugin.Photobucket.csproj index 50e39b62a..d0151b7c0 100644 --- a/src/Greenshot.Plugin.Photobucket/Greenshot.Plugin.Photobucket.csproj +++ b/src/Greenshot.Plugin.Photobucket/Greenshot.Plugin.Photobucket.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs index 783762320..231ca594d 100644 --- a/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Photobucket/Properties/AssemblyInfo.cs @@ -21,12 +21,14 @@ using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plugin to upload images to Photobucket")] +[assembly: AssemblyPluginIdentifier("Photobucket Plugin")] // This sets the default COM visibility of types in the assembly to invisible. // If you need to expose a type to COM, use [ComVisible(true)] on that type. diff --git a/src/Greenshot.Plugin.Win10/Destinations/Win10ShareDestination.cs b/src/Greenshot.Plugin.Win10/Destinations/Win10ShareDestination.cs index 0f2557da2..fa31d3a11 100644 --- a/src/Greenshot.Plugin.Win10/Destinations/Win10ShareDestination.cs +++ b/src/Greenshot.Plugin.Win10/Destinations/Win10ShareDestination.cs @@ -29,9 +29,11 @@ using System.Windows.Interop; using System.Windows.Media; using Windows.Storage; using Windows.Storage.Streams; +using Dapplo.Windows.Desktop; +using Dapplo.Windows.Enums; +using Dapplo.Windows.User32; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; -using Greenshot.Base.Hooking; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Plugin; using Greenshot.Plugin.Win10.Internal; @@ -82,24 +84,22 @@ namespace Greenshot.Plugin.Win10.Destinations triggerWindow.Show(); - var focusMonitor = new WindowsOpenCloseMonitor(); var windowHandle = new WindowInteropHelper(triggerWindow).Handle; // This is a bad trick, but don't know how else to do it. // Wait for the focus to return, and depending on the state close the window! - focusMonitor.WindowOpenCloseChangeEvent += e => + var createDestroyMonitor = WinEventHook.WindowTitleChangeObservable().Subscribe(wei => { - if (e.IsOpen) + if (wei.WinEvent == WinEvents.EVENT_OBJECT_CREATE) { - if ("Windows Shell Experience Host" == e.Title) + var windowTitle = User32Api.GetText(wei.Handle); + if ("Windows Shell Experience Host" == windowTitle) { - shareInfo.SharingHwnd = e.HWnd; + shareInfo.SharingHwnd = wei.Handle; } - return; } - - if (e.HWnd == shareInfo.SharingHwnd) + if (wei.Handle == shareInfo.SharingHwnd) { if (shareInfo.ApplicationName != null) { @@ -108,12 +108,12 @@ namespace Greenshot.Plugin.Win10.Destinations shareInfo.ShareTask.TrySetResult(false); } - }; + }); Share(shareInfo, windowHandle, surface, captureDetails).GetAwaiter().GetResult(); Log.Debug("Sharing finished, closing window."); triggerWindow.Close(); - focusMonitor.Dispose(); + createDestroyMonitor.Dispose(); if (string.IsNullOrWhiteSpace(shareInfo.ApplicationName)) { exportInformation.ExportMade = false; @@ -151,7 +151,7 @@ namespace Greenshot.Plugin.Win10.Destinations outputSettings.PreventGreenshotFormat(); // Create capture for export - ImageOutput.SaveToStream(surface, imageStream, outputSettings); + ImageIO.SaveToStream(surface, imageStream, outputSettings); imageStream.Position = 0; Log.Debug("Created RandomAccessStreamReference for the image"); var imageRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(imageStream); @@ -161,7 +161,7 @@ namespace Greenshot.Plugin.Win10.Destinations using (var tmpImageForThumbnail = surface.GetImageForExport()) using (var thumbnail = ImageHelper.CreateThumbnail(tmpImageForThumbnail, 240, 160)) { - ImageOutput.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); + ImageIO.SaveToStream(thumbnail, null, thumbnailStream, outputSettings); thumbnailStream.Position = 0; thumbnailRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(thumbnailStream); Log.Debug("Created RandomAccessStreamReference for the thumbnail"); @@ -172,7 +172,7 @@ namespace Greenshot.Plugin.Win10.Destinations using (var logo = GreenshotResources.GetGreenshotIcon().ToBitmap()) using (var logoThumbnail = ImageHelper.CreateThumbnail(logo, 30, 30)) { - ImageOutput.SaveToStream(logoThumbnail, null, logoStream, outputSettings); + ImageIO.SaveToStream(logoThumbnail, null, logoStream, outputSettings); logoStream.Position = 0; logoRandomAccessStreamReference = RandomAccessStreamReference.CreateFromStream(logoStream); Log.Info("Created RandomAccessStreamReference for the logo"); diff --git a/src/Greenshot.Plugin.Win10/Greenshot.Plugin.Win10.csproj b/src/Greenshot.Plugin.Win10/Greenshot.Plugin.Win10.csproj index c1c1729e0..14126adb3 100644 --- a/src/Greenshot.Plugin.Win10/Greenshot.Plugin.Win10.csproj +++ b/src/Greenshot.Plugin.Win10/Greenshot.Plugin.Win10.csproj @@ -1,4 +1,8 @@  + + none + false + PreserveNewest diff --git a/src/Greenshot.Plugin.Win10/Native/DataTransferManagerHelper.cs b/src/Greenshot.Plugin.Win10/Native/DataTransferManagerHelper.cs index a03b07266..1ef1059c4 100644 --- a/src/Greenshot.Plugin.Win10/Native/DataTransferManagerHelper.cs +++ b/src/Greenshot.Plugin.Win10/Native/DataTransferManagerHelper.cs @@ -22,7 +22,7 @@ using System; using System.Runtime.InteropServices.WindowsRuntime; using Windows.ApplicationModel.DataTransfer; -using Greenshot.Base.Core; +using Dapplo.Windows.Common.Extensions; namespace Greenshot.Plugin.Win10.Native { diff --git a/src/Greenshot.Plugin.Win10/Native/IDataTransferManagerInterOp.cs b/src/Greenshot.Plugin.Win10/Native/IDataTransferManagerInterOp.cs index bba908bb8..408f5f451 100644 --- a/src/Greenshot.Plugin.Win10/Native/IDataTransferManagerInterOp.cs +++ b/src/Greenshot.Plugin.Win10/Native/IDataTransferManagerInterOp.cs @@ -20,7 +20,7 @@ using System; using System.Runtime.InteropServices; using Windows.ApplicationModel.DataTransfer; -using Greenshot.Base.Core.Enums; +using Dapplo.Windows.Common.Enums; namespace Greenshot.Plugin.Win10.Native { diff --git a/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs b/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs index d1b6cbd1b..3f4b5bef2 100644 --- a/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs +++ b/src/Greenshot.Plugin.Win10/Properties/AssemblyInfo.cs @@ -1,10 +1,33 @@ -using System.Reflection; +/* + * Greenshot - a free and open source screenshot tool + * Copyright (C) 2007-2025 Thomas Braun, Jens Klingen, Robin Krom + * + * For more information see: https://getgreenshot.org/ + * The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 1 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +using System.Reflection; using System.Runtime.InteropServices; +using Greenshot.Base.Interfaces.Plugin; // 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: AssemblyDescription("A plug-in for Windows 10 only functionality")] +[assembly: AssemblyPluginIdentifier("Win10 Plugin")] // 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 diff --git a/src/Greenshot.Plugin.Win10/ToastNotificationService.cs b/src/Greenshot.Plugin.Win10/ToastNotificationService.cs index b9120fee7..52005356c 100644 --- a/src/Greenshot.Plugin.Win10/ToastNotificationService.cs +++ b/src/Greenshot.Plugin.Win10/ToastNotificationService.cs @@ -95,7 +95,17 @@ namespace Greenshot.Plugin.Win10 } // Prepare the toast notifier. Be sure to specify the AppUserModelId on your application's shortcut! - var toastNotifier = ToastNotificationManagerCompat.CreateToastNotifier(); + Microsoft.Toolkit.Uwp.Notifications.ToastNotifierCompat toastNotifier = null; + try + { + toastNotifier = ToastNotificationManagerCompat.CreateToastNotifier(); + } + catch (Exception ex) + { + Log.Warn("Could not create a toast notifier.", ex); + + return; + } // Here is an interesting article on reading the settings: https://www.rudyhuyn.com/blog/2018/02/10/toastnotifier-and-settings-careful-with-non-uwp-applications/ try diff --git a/src/Greenshot.Plugin.Win10/Win10OcrProvider.cs b/src/Greenshot.Plugin.Win10/Win10OcrProvider.cs index 77aa0d663..e33909581 100644 --- a/src/Greenshot.Plugin.Win10/Win10OcrProvider.cs +++ b/src/Greenshot.Plugin.Win10/Win10OcrProvider.cs @@ -26,6 +26,7 @@ using System.Threading.Tasks; using Windows.Graphics.Imaging; using Windows.Media.Ocr; using Windows.Storage.Streams; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.Effects; @@ -97,7 +98,7 @@ namespace Greenshot.Plugin.Win10 IEffect effect = new ResizeCanvasEffect(addedWidth, addedWidth, addedHeight, addedHeight); outputSettings.Effects.Add(effect); } - ImageOutput.SaveToStream(surface, imageStream, outputSettings); + ImageIO.SaveToStream(surface, imageStream, outputSettings); imageStream.Position = 0; var randomAccessStream = imageStream.AsRandomAccessStream(); @@ -117,7 +118,7 @@ namespace Greenshot.Plugin.Win10 OcrInformation result; using (var imageStream = new MemoryStream()) { - ImageOutput.SaveToStream(image, null, imageStream, new SurfaceOutputSettings()); + ImageIO.SaveToStream(image, null, imageStream, new SurfaceOutputSettings()); imageStream.Position = 0; var randomAccessStream = imageStream.AsRandomAccessStream(); @@ -169,7 +170,7 @@ namespace Greenshot.Plugin.Win10 for (var index = 0; index < ocrLine.Words.Count; index++) { var ocrWord = ocrLine.Words[index]; - var location = new Rectangle((int) ocrWord.BoundingRect.X, (int) ocrWord.BoundingRect.Y, + var location = new NativeRect((int) ocrWord.BoundingRect.X, (int) ocrWord.BoundingRect.Y, (int) ocrWord.BoundingRect.Width, (int) ocrWord.BoundingRect.Height); var word = line.Words[index]; diff --git a/src/Greenshot.sln b/src/Greenshot.sln index 91ddf4314..b71e79bd3 100644 --- a/src/Greenshot.sln +++ b/src/Greenshot.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29728.190 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34009.444 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot", "Greenshot\Greenshot.csproj", "{CD642BF4-D815-4D67-A0B5-C69F0B8231AF}" ProjectSection(ProjectDependencies) = postProject @@ -48,6 +48,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\azure-pipelines.yml = ..\azure-pipelines.yml Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets + ..\.github\workflows\release.yml = ..\.github\workflows\release.yml EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Greenshot.Editor", "Greenshot.Editor\Greenshot.Editor.csproj", "{148D3C8B-D6EC-4A7D-80E9-243A81F19DD2}" diff --git a/src/Greenshot/App.config b/src/Greenshot/App.config index 3b81b058d..ab8a7c40c 100644 --- a/src/Greenshot/App.config +++ b/src/Greenshot/App.config @@ -1,7 +1,6 @@ - @@ -12,8 +11,7 @@ - - + \ No newline at end of file diff --git a/src/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs b/src/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs index 2c0446d09..0a9a511c7 100644 --- a/src/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs +++ b/src/Greenshot/Controls/ContextMenuToolStripProfessionalRenderer.cs @@ -21,8 +21,11 @@ using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Dpi; using Greenshot.Base.Core; using Greenshot.Base.IniFile; +using Greenshot.Base.Interfaces; namespace Greenshot.Controls { @@ -31,19 +34,25 @@ namespace Greenshot.Controls /// public class ContextMenuToolStripProfessionalRenderer : ToolStripProfessionalRenderer { + private readonly IProvideDeviceDpi _provideDeviceDpi; private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private static Image _scaledCheckbox; + public ContextMenuToolStripProfessionalRenderer(IProvideDeviceDpi provideDeviceDpi) + { + _provideDeviceDpi = provideDeviceDpi; + } protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { - if (_scaledCheckbox == null || _scaledCheckbox.Size != CoreConfig.ScaledIconSize) + var newSize = DpiCalculator.ScaleWithDpi(CoreConfig.IconSize, _provideDeviceDpi.DeviceDpi); + if (_scaledCheckbox == null || _scaledCheckbox.Size != newSize) { _scaledCheckbox?.Dispose(); - _scaledCheckbox = ImageHelper.ResizeImage(e.Image, true, CoreConfig.ScaledIconSize.Width, CoreConfig.ScaledIconSize.Height, null); + _scaledCheckbox = ImageHelper.ResizeImage(e.Image, true, newSize.Width, newSize.Height, null); } - Rectangle old = e.ImageRectangle; - ToolStripItemImageRenderEventArgs clone = new ToolStripItemImageRenderEventArgs(e.Graphics, e.Item, _scaledCheckbox, new Rectangle(old.X, 0, old.Width, old.Height)); + NativeRect old = e.ImageRectangle; + ToolStripItemImageRenderEventArgs clone = new ToolStripItemImageRenderEventArgs(e.Graphics, e.Item, _scaledCheckbox, new NativeRect(old.X, 0, old.Width, old.Height)); base.OnRenderItemCheck(clone); } } diff --git a/src/Greenshot/Destinations/FileDestination.cs b/src/Greenshot/Destinations/FileDestination.cs index 9389c3d26..64f8f21a9 100644 --- a/src/Greenshot/Destinations/FileDestination.cs +++ b/src/Greenshot/Destinations/FileDestination.cs @@ -68,7 +68,7 @@ namespace Greenshot.Destinations overwrite = true; Log.InfoFormat("Using previous filename"); fullPath = captureDetails.Filename; - outputSettings.Format = ImageOutput.FormatForFilename(fullPath); + outputSettings.Format = ImageIO.FormatForFilename(fullPath); } else { @@ -87,7 +87,7 @@ namespace Greenshot.Destinations // This is done for e.g. bugs #2974608, #2963943, #2816163, #2795317, #2789218, #3004642 try { - ImageOutput.Save(surface, fullPath, overwrite, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); + ImageIO.Save(surface, fullPath, overwrite, outputSettings, CoreConfig.OutputFileCopyPathToClipboard); outputMade = true; } catch (ArgumentException ex1) @@ -95,7 +95,7 @@ namespace Greenshot.Destinations // Our generated filename exists, display 'save-as' Log.InfoFormat("Not overwriting: {0}", ex1.Message); // when we don't allow to overwrite present a new SaveWithDialog - fullPath = ImageOutput.SaveWithDialog(surface, captureDetails); + fullPath = ImageIO.SaveWithDialog(surface, captureDetails); outputMade = fullPath != null; } catch (Exception ex2) @@ -104,7 +104,7 @@ namespace Greenshot.Destinations // Show the problem MessageBox.Show(Language.GetString(LangKey.error_save), Language.GetString(LangKey.error)); // when save failed we present a SaveWithDialog - fullPath = ImageOutput.SaveWithDialog(surface, captureDetails); + fullPath = ImageIO.SaveWithDialog(surface, captureDetails); outputMade = fullPath != null; } diff --git a/src/Greenshot/Destinations/FileWithDialogDestination.cs b/src/Greenshot/Destinations/FileWithDialogDestination.cs index 3a8520fb0..72924689f 100644 --- a/src/Greenshot/Destinations/FileWithDialogDestination.cs +++ b/src/Greenshot/Destinations/FileWithDialogDestination.cs @@ -57,7 +57,7 @@ namespace Greenshot.Destinations { ExportInformation exportInformation = new ExportInformation(Designation, Description); // Bug #2918756 don't overwrite path if SaveWithDialog returns null! - var savedTo = ImageOutput.SaveWithDialog(surface, captureDetails); + var savedTo = ImageIO.SaveWithDialog(surface, captureDetails); if (savedTo != null) { exportInformation.ExportMade = true; diff --git a/src/Greenshot/Forms/AboutForm.cs b/src/Greenshot/Forms/AboutForm.cs index edb00a6ac..a9cfc2cfc 100644 --- a/src/Greenshot/Forms/AboutForm.cs +++ b/src/Greenshot/Forms/AboutForm.cs @@ -28,6 +28,7 @@ using System.Drawing.Imaging; using System.IO; using System.Security.Permissions; using System.Windows.Forms; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.IniFile; using Greenshot.Configuration; @@ -69,43 +70,43 @@ namespace Greenshot.Forms /// /// The location of every dot in the "G" /// - private readonly List _gSpots = new List + private readonly List _gSpots = new List { // Top row - new Point(P2, P1), // 0 - new Point(P3, P1), // 1 - new Point(P4, P1), // 2 - new Point(P5, P1), // 3 - new Point(P6, P1), // 4 + new(P2, P1), // 0 + new(P3, P1), // 1 + new(P4, P1), // 2 + new(P5, P1), // 3 + new(P6, P1), // 4 // Second row - new Point(P1, P2), // 5 - new Point(P2, P2), // 6 + new(P1, P2), // 5 + new(P2, P2), // 6 // Third row - new Point(P1, P3), // 7 - new Point(P2, P3), // 8 + new(P1, P3), // 7 + new(P2, P3), // 8 // Fourth row - new Point(P1, P4), // 9 - new Point(P2, P4), // 10 - new Point(P5, P4), // 11 - new Point(P6, P4), // 12 - new Point(P7, P4), // 13 + new(P1, P4), // 9 + new(P2, P4), // 10 + new(P5, P4), // 11 + new(P6, P4), // 12 + new(P7, P4), // 13 // Fifth row - new Point(P1, P5), // 14 - new Point(P2, P5), // 15 - new Point(P6, P5), // 16 - new Point(P7, P5), // 17 + new(P1, P5), // 14 + new(P2, P5), // 15 + new(P6, P5), // 16 + new(P7, P5), // 17 // Sixth row - new Point(P1, P6), // 18 - new Point(P2, P6), // 19 - new Point(P3, P6), // 20 - new Point(P4, P6), // 21 - new Point(P5, P6), // 22 - new Point(P6, P6) // 23 + new(P1, P6), // 18 + new(P2, P6), // 19 + new(P3, P6), // 20 + new(P4, P6), // 21 + new(P5, P6), // 22 + new(P6, P6) // 23 }; // 0 1 2 3 4 @@ -165,7 +166,7 @@ namespace Greenshot.Forms for (int index = 0; index < _gSpots.Count; index++) { // Read the pixels in the order of the flow - Point gSpot = _gSpots[_flowOrder[index]]; + NativePoint gSpot = _gSpots[_flowOrder[index]]; // Create the animation, first we do nothing (on the final destination) RectangleAnimator pixelAnimation; @@ -176,15 +177,15 @@ namespace Greenshot.Forms if (IsTerminalServerSession) { // No animation - pixelAnimation = new RectangleAnimator(new Rectangle(gSpot.X, gSpot.Y, W - 2, W - 2), new Rectangle(gSpot.X, gSpot.Y, W - 2, W - 2), 1, EasingType.Cubic, EasingMode.EaseIn); + pixelAnimation = new RectangleAnimator(new NativeRect(gSpot.X, gSpot.Y, W - 2, W - 2), new NativeRect(gSpot.X, gSpot.Y, W - 2, W - 2), 1, EasingType.Cubic, EasingMode.EaseIn); } else { // Create the animation, first we do nothing (on the final destination) - Rectangle standingStill = new Rectangle(gSpot.X + offset, gSpot.Y + offset, 0, 0); + NativeRect standingStill = new NativeRect(gSpot.X + offset, gSpot.Y + offset, 0, 0); pixelAnimation = new RectangleAnimator(standingStill, standingStill, pixelWaitFrames, EasingType.Quintic, EasingMode.EaseIn); // And than we size to the wanted size. - pixelAnimation.QueueDestinationLeg(new Rectangle(gSpot.X, gSpot.Y, W - 2, W - 2), frames); + pixelAnimation.QueueDestinationLeg(new NativeRect(gSpot.X, gSpot.Y, W - 2, W - 2), frames); } // Increase the wait frames @@ -218,7 +219,7 @@ namespace Greenshot.Forms /// private void LinkLabelClicked(object sender, LinkLabelLinkClickedEventArgs e) { - if (!(sender is LinkLabel linkLabel)) return; + if (sender is not LinkLabel linkLabel) return; var link = linkLabel.Tag?.ToString() ?? linkLabel.Text; try { diff --git a/src/Greenshot/Forms/CaptureForm.cs b/src/Greenshot/Forms/CaptureForm.cs index f8b2c004b..107aa9096 100644 --- a/src/Greenshot/Forms/CaptureForm.cs +++ b/src/Greenshot/Forms/CaptureForm.cs @@ -30,14 +30,15 @@ using System.Security.Permissions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Enums; using Greenshot.Base.Controls; using Greenshot.Base.Core; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Ocr; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; -using Greenshot.Editor.Helpers; namespace Greenshot.Forms { @@ -72,15 +73,15 @@ namespace Greenshot.Forms private int _mX; private int _mY; - private Point _mouseMovePos = Point.Empty; - private Point _cursorPos; + private NativePoint _mouseMovePos = NativePoint.Empty; + private NativePoint _cursorPos; private CaptureMode _captureMode; private readonly List _windows; private WindowDetails _selectedCaptureWindow; private bool _mouseDown; - private Rectangle _captureRect = Rectangle.Empty; + private NativeRect _captureRect = NativeRect.Empty; private readonly ICapture _capture; - private Point _previousMousePos = Point.Empty; + private NativePoint _previousMousePos = NativePoint.Empty; private FixMode _fixMode = FixMode.None; private RectangleAnimator _windowAnimator; private RectangleAnimator _zoomAnimator; @@ -91,7 +92,7 @@ namespace Greenshot.Forms /// /// Property to access the selected capture rectangle /// - public Rectangle CaptureRectangle => _captureRect; + public NativeRect CaptureRectangle => _captureRect; /// /// Property to access the used capture mode @@ -181,7 +182,7 @@ namespace Greenshot.Forms // Initialize the animations, the window capture zooms out from the cursor to the window under the cursor if (_captureMode == CaptureMode.Window) { - _windowAnimator = new RectangleAnimator(new Rectangle(_cursorPos, Size.Empty), _captureRect, FramesForMillis(700), EasingType.Quintic, EasingMode.EaseOut); + _windowAnimator = new RectangleAnimator(new NativeRect(_cursorPos, Size.Empty), _captureRect, FramesForMillis(700), EasingType.Quintic, EasingMode.EaseOut); } // Set the zoomer animation @@ -196,7 +197,7 @@ namespace Greenshot.Forms private void CaptureForm_Resize(object sender, EventArgs e) { Log.DebugFormat("Resize was called, new size: {0}", this.Bounds); - if (Bounds.Equals(_capture.ScreenBounds)) + if (_capture.ScreenBounds.Equals(Bounds)) { // We have the correct size return; @@ -225,12 +226,12 @@ namespace Greenshot.Forms if (isOn) { // Initialize the zoom with a invalid position - _zoomAnimator = new RectangleAnimator(Rectangle.Empty, new Rectangle(int.MaxValue, int.MaxValue, 0, 0), FramesForMillis(1000), EasingType.Quintic, EasingMode.EaseOut); + _zoomAnimator = new RectangleAnimator(NativeRect.Empty, new NativeRect(int.MaxValue, int.MaxValue, 0, 0), FramesForMillis(1000), EasingType.Quintic, EasingMode.EaseOut); VerifyZoomAnimation(_cursorPos, false); } else { - _zoomAnimator?.ChangeDestination(new Rectangle(Point.Empty, Size.Empty), FramesForMillis(1000)); + _zoomAnimator?.ChangeDestination(new NativeRect(NativePoint.Empty, NativeSize.Empty), FramesForMillis(1000)); } } @@ -319,8 +320,8 @@ namespace Greenshot.Forms // "Fade out" Zoom InitializeZoomer(false); // "Fade in" window - _windowAnimator = new RectangleAnimator(new Rectangle(_cursorPos, Size.Empty), _captureRect, FramesForMillis(700), EasingType.Quintic, EasingMode.EaseOut); - _captureRect = Rectangle.Empty; + _windowAnimator = new RectangleAnimator(new NativeRect(_cursorPos, NativeSize.Empty), _captureRect, FramesForMillis(700), EasingType.Quintic, EasingMode.EaseOut); + _captureRect = NativeRect.Empty; Invalidate(); break; case CaptureMode.Text: @@ -332,10 +333,10 @@ namespace Greenshot.Forms // Set the region capture mode _captureMode = CaptureMode.Region; // "Fade out" window - _windowAnimator.ChangeDestination(new Rectangle(_cursorPos, Size.Empty), FramesForMillis(700)); + _windowAnimator.ChangeDestination(new NativeRect(_cursorPos, NativeSize.Empty), FramesForMillis(700)); // Fade in zoom InitializeZoomer(Conf.ZoomerEnabled); - _captureRect = Rectangle.Empty; + _captureRect = NativeRect.Empty; Invalidate(); break; } @@ -403,7 +404,7 @@ namespace Greenshot.Forms private void HandleMouseDown() { - Point tmpCursorLocation = WindowCapture.GetCursorLocationRelativeToScreenBounds(); + NativePoint tmpCursorLocation = WindowCapture.GetCursorLocationRelativeToScreenBounds(); _mX = tmpCursorLocation.X; _mY = tmpCursorLocation.Y; _mouseDown = true; @@ -424,10 +425,11 @@ namespace Greenshot.Forms else if (_captureRect.Height > 0 && _captureRect.Width > 0) { // correct the GUI width to real width if Region mode - if (_captureMode == CaptureMode.Region || _captureMode == CaptureMode.Text) + if (_captureMode is CaptureMode.Region or CaptureMode.Text) { - _captureRect.Width += 1; - _captureRect.Height += 1; + // Correct the rectangle size, by making it 1 pixel bigger + // We cannot use inflate, this would make the rect bigger to all sizes. + _captureRect = new NativeRect(_captureRect.Left, _captureRect.Top, _captureRect.Width+1, _captureRect.Height+1); } // Go and process the capture @@ -436,7 +438,7 @@ namespace Greenshot.Forms else if (_captureMode == CaptureMode.Text && IsWordUnderCursor(_mouseMovePos)) { // Handle a click on a single word - _captureRect = new Rectangle(_mouseMovePos, new Size(1, 1)); + _captureRect = new NativeRect(_mouseMovePos, new NativeSize(1, 1)); // Go and process the capture DialogResult = DialogResult.OK; } @@ -447,11 +449,11 @@ namespace Greenshot.Forms } /// - /// + /// Check if there is a word under the specified location /// - /// - /// - private bool IsWordUnderCursor(Point cursorLocation) + /// NativePoint + /// bool true if there is a word + private bool IsWordUnderCursor(NativePoint location) { if (_captureMode != CaptureMode.Text || _capture.CaptureDetails.OcrInformation == null) return false; @@ -462,10 +464,10 @@ namespace Greenshot.Forms var lineBounds = line.CalculatedBounds; if (lineBounds.IsEmpty) continue; // Highlight the text which is selected - if (!lineBounds.Contains(cursorLocation)) continue; + if (!lineBounds.Contains(location)) continue; foreach (var word in line.Words) { - if (word.Bounds.Contains(cursorLocation)) + if (word.Bounds.Contains(location)) { return true; } @@ -493,7 +495,7 @@ namespace Greenshot.Forms /// /// /// - private Point FixMouseCoordinates(Point currentMouse) + private NativePoint FixMouseCoordinates(NativePoint currentMouse) { if (_fixMode == FixMode.Initiated) { @@ -508,11 +510,11 @@ namespace Greenshot.Forms } else if (_fixMode == FixMode.Vertical) { - currentMouse = new Point(currentMouse.X, _previousMousePos.Y); + currentMouse = new NativePoint(currentMouse.X, _previousMousePos.Y); } else if (_fixMode == FixMode.Horizontal) { - currentMouse = new Point(_previousMousePos.X, currentMouse.Y); + currentMouse = new NativePoint(_previousMousePos.X, currentMouse.Y); } _previousMousePos = currentMouse; @@ -527,7 +529,7 @@ namespace Greenshot.Forms private void OnMouseMove(object sender, MouseEventArgs e) { // Make sure the mouse coordinates are fixed, when pressing shift - var mouseMovePos = FixMouseCoordinates(User32.GetCursorLocation()); + var mouseMovePos = FixMouseCoordinates(User32Api.GetCursorLocation()); _mouseMovePos = WindowCapture.GetLocationRelativeToScreenBounds(mouseMovePos); } @@ -551,7 +553,7 @@ namespace Greenshot.Forms /// protected override void Animate() { - Point lastPos = _cursorPos; + NativePoint lastPos = _cursorPos; _cursorPos = _mouseMovePos; if (_selectedCaptureWindow != null && lastPos.Equals(_cursorPos) && !IsAnimating(_zoomAnimator) && !IsAnimating(_windowAnimator)) @@ -575,11 +577,11 @@ namespace Greenshot.Forms if ((_captureMode == CaptureMode.Region || _captureMode == CaptureMode.Text) && _mouseDown) { - _captureRect = GuiRectangle.GetGuiRectangle(_cursorPos.X, _cursorPos.Y, _mX - _cursorPos.X, _mY - _cursorPos.Y); + _captureRect = new NativeRect(_cursorPos.X, _cursorPos.Y, _mX - _cursorPos.X, _mY - _cursorPos.Y).Normalize(); } // Iterate over the found windows and check if the current location is inside a window - Point cursorPosition = Cursor.Position; + NativePoint cursorPosition = Cursor.Position; _selectedCaptureWindow = null; lock (_windows) { @@ -605,11 +607,11 @@ namespace Greenshot.Forms // Here we want to capture the window which is under the mouse _captureRect = _selectedCaptureWindow.WindowRectangle; // As the ClientRectangle is not in Bitmap coordinates, we need to correct. - _captureRect.Offset(-_capture.ScreenBounds.Location.X, -_capture.ScreenBounds.Location.Y); + _captureRect = _captureRect.Offset(-_capture.ScreenBounds.Location.X, -_capture.ScreenBounds.Location.Y); } } - Rectangle invalidateRectangle; + NativeRect invalidateRectangle; if (_mouseDown && (_captureMode != CaptureMode.Window)) { int x1 = Math.Min(_mX, lastPos.X); @@ -640,32 +642,32 @@ namespace Greenshot.Forms y1 -= measureHeight.Height + 10; } - invalidateRectangle = new Rectangle(x1, y1, x2 - x1, y2 - y1); + invalidateRectangle = new NativeRect(x1, y1, x2 - x1, y2 - y1); Invalidate(invalidateRectangle); } else if (_captureMode != CaptureMode.Window) { if (!IsTerminalServerSession) { - Rectangle allScreenBounds = WindowCapture.GetScreenBounds(); - allScreenBounds.Location = WindowCapture.GetLocationRelativeToScreenBounds(allScreenBounds.Location); + var allScreenBounds = DisplayInfo.ScreenBounds; + allScreenBounds = allScreenBounds.MoveTo(WindowCapture.GetLocationRelativeToScreenBounds(allScreenBounds.Location)); if (verticalMove) { // Before - invalidateRectangle = GuiRectangle.GetGuiRectangle(allScreenBounds.Left, lastPos.Y - 2, Width + 2, 45); + invalidateRectangle = new NativeRect(allScreenBounds.Left, lastPos.Y - 2, Width + 2, 45).Normalize(); Invalidate(invalidateRectangle); // After - invalidateRectangle = GuiRectangle.GetGuiRectangle(allScreenBounds.Left, _cursorPos.Y - 2, Width + 2, 45); + invalidateRectangle = new NativeRect(allScreenBounds.Left, _cursorPos.Y - 2, Width + 2, 45).Normalize(); Invalidate(invalidateRectangle); } if (horizontalMove) { // Before - invalidateRectangle = GuiRectangle.GetGuiRectangle(lastPos.X - 2, allScreenBounds.Top, 75, Height + 2); + invalidateRectangle = new NativeRect(lastPos.X - 2, allScreenBounds.Top, 75, Height + 2).Normalize(); Invalidate(invalidateRectangle); // After - invalidateRectangle = GuiRectangle.GetGuiRectangle(_cursorPos.X - 2, allScreenBounds.Top, 75, Height + 2); + invalidateRectangle = new NativeRect(_cursorPos.X - 2, allScreenBounds.Top, 75, Height + 2).Normalize(); Invalidate(invalidateRectangle); } } @@ -685,11 +687,9 @@ namespace Greenshot.Forms // Check if the animation needs to be drawn if (IsAnimating(_windowAnimator)) { - invalidateRectangle = _windowAnimator.Current; - invalidateRectangle.Inflate(safetySize, safetySize); + invalidateRectangle = _windowAnimator.Current.Inflate(safetySize, safetySize); Invalidate(invalidateRectangle); - invalidateRectangle = _windowAnimator.Next(); - invalidateRectangle.Inflate(safetySize, safetySize); + invalidateRectangle = _windowAnimator.Next().Inflate(safetySize, safetySize); Invalidate(invalidateRectangle); // Check if this was the last of the windows animations in the normal region capture. if (_captureMode != CaptureMode.Window && !IsAnimating(_windowAnimator)) @@ -701,8 +701,7 @@ namespace Greenshot.Forms if (_zoomAnimator != null && (IsAnimating(_zoomAnimator) || _captureMode != CaptureMode.Window)) { // Make sure we invalidate the old zoom area - invalidateRectangle = _zoomAnimator.Current; - invalidateRectangle.Offset(lastPos); + invalidateRectangle = _zoomAnimator.Current.Offset(lastPos); Invalidate(invalidateRectangle); // Only verify if we are really showing the zoom, not the outgoing animation if (Conf.ZoomerEnabled && _captureMode != CaptureMode.Window) @@ -713,7 +712,7 @@ namespace Greenshot.Forms // The following logic is not needed, next always returns the current if there are no frames left // but it makes more sense if we want to change something in the logic invalidateRectangle = IsAnimating(_zoomAnimator) ? _zoomAnimator.Next() : _zoomAnimator.Current; - invalidateRectangle.Offset(_cursorPos); + invalidateRectangle = invalidateRectangle.Offset(_cursorPos); Invalidate(invalidateRectangle); } @@ -722,7 +721,7 @@ namespace Greenshot.Forms { var ocrInfo = _capture.CaptureDetails.OcrInformation; - invalidateRectangle = Rectangle.Empty; + invalidateRectangle = NativeRect.Empty; foreach (var line in ocrInfo.Lines) { var lineBounds = line.CalculatedBounds; @@ -733,22 +732,20 @@ namespace Greenshot.Forms if (_mouseDown) { // Highlight the text which is selected - if (lineBounds.IntersectsWith(_captureRect)) + if (!lineBounds.IntersectsWith(_captureRect)) continue; + foreach (var word in line.Words) { - foreach (var word in line.Words) + if (!word.Bounds.IntersectsWith(_captureRect)) { - if (!word.Bounds.IntersectsWith(_captureRect)) - { - continue; - } - if (invalidateRectangle.IsEmpty) - { - invalidateRectangle = word.Bounds; - } - else - { - invalidateRectangle = Rectangle.Union(invalidateRectangle, word.Bounds); - } + continue; + } + if (invalidateRectangle.IsEmpty) + { + invalidateRectangle = word.Bounds; + } + else + { + invalidateRectangle = invalidateRectangle.Union(word.Bounds); } } } @@ -763,7 +760,7 @@ namespace Greenshot.Forms } else { - invalidateRectangle = Rectangle.Union(invalidateRectangle, word.Bounds); + invalidateRectangle = invalidateRectangle.Union(word.Bounds); } break; @@ -794,52 +791,51 @@ namespace Greenshot.Forms /// /// preferred destination location for the zoom area /// false to try to find a location which is neither out of screen bounds nor intersects with the selected rectangle - private void VerifyZoomAnimation(Point pos, bool allowZoomOverCaptureRect) + private void VerifyZoomAnimation(NativePoint pos, bool allowZoomOverCaptureRect) { - Rectangle screenBounds = Screen.GetBounds(MousePosition); + NativeRect screenBounds = DisplayInfo.GetBounds(MousePosition); // convert to be relative to top left corner of all screen bounds - screenBounds.Location = WindowCapture.GetLocationRelativeToScreenBounds(screenBounds.Location); + screenBounds = screenBounds.MoveTo(WindowCapture.GetLocationRelativeToScreenBounds(screenBounds.Location)); int relativeZoomSize = Math.Min(screenBounds.Width, screenBounds.Height) / 5; // Make sure the final size is a plural of 4, this makes it look better relativeZoomSize -= relativeZoomSize % 4; - Size zoomSize = new Size(relativeZoomSize, relativeZoomSize); - Point zoomOffset = new Point(20, 20); + var zoomSize = new NativeSize(relativeZoomSize, relativeZoomSize); + var zoomOffset = new NativePoint(20, 20); - Rectangle targetRectangle = _zoomAnimator.Final; - targetRectangle.Offset(pos); + NativeRect targetRectangle = _zoomAnimator.Final.Offset(pos); if (screenBounds.Contains(targetRectangle) && (allowZoomOverCaptureRect || !_captureRect.IntersectsWith(targetRectangle))) { return; } - Point destinationLocation = Point.Empty; - Rectangle tl = new Rectangle(pos.X - (zoomOffset.X + zoomSize.Width), pos.Y - (zoomOffset.Y + zoomSize.Height), zoomSize.Width, zoomSize.Height); - Rectangle tr = new Rectangle(pos.X + zoomOffset.X, pos.Y - (zoomOffset.Y + zoomSize.Height), zoomSize.Width, zoomSize.Height); - Rectangle bl = new Rectangle(pos.X - (zoomOffset.X + zoomSize.Width), pos.Y + zoomOffset.Y, zoomSize.Width, zoomSize.Height); - Rectangle br = new Rectangle(pos.X + zoomOffset.X, pos.Y + zoomOffset.Y, zoomSize.Width, zoomSize.Height); + var destinationLocation = NativePoint.Empty; + var tl = new NativeRect(pos.X - (zoomOffset.X + zoomSize.Width), pos.Y - (zoomOffset.Y + zoomSize.Height), zoomSize.Width, zoomSize.Height); + var tr = new NativeRect(pos.X + zoomOffset.X, pos.Y - (zoomOffset.Y + zoomSize.Height), zoomSize.Width, zoomSize.Height); + var bl = new NativeRect(pos.X - (zoomOffset.X + zoomSize.Width), pos.Y + zoomOffset.Y, zoomSize.Width, zoomSize.Height); + var br = new NativeRect(pos.X + zoomOffset.X, pos.Y + zoomOffset.Y, zoomSize.Width, zoomSize.Height); if (screenBounds.Contains(br) && (allowZoomOverCaptureRect || !_captureRect.IntersectsWith(br))) { - destinationLocation = new Point(zoomOffset.X, zoomOffset.Y); + destinationLocation = new NativePoint(zoomOffset.X, zoomOffset.Y); } else if (screenBounds.Contains(bl) && (allowZoomOverCaptureRect || !_captureRect.IntersectsWith(bl))) { - destinationLocation = new Point(-zoomOffset.X - zoomSize.Width, zoomOffset.Y); + destinationLocation = new NativePoint(-zoomOffset.X - zoomSize.Width, zoomOffset.Y); } else if (screenBounds.Contains(tr) && (allowZoomOverCaptureRect || !_captureRect.IntersectsWith(tr))) { - destinationLocation = new Point(zoomOffset.X, -zoomOffset.Y - zoomSize.Width); + destinationLocation = new NativePoint(zoomOffset.X, -zoomOffset.Y - zoomSize.Width); } else if (screenBounds.Contains(tl) && (allowZoomOverCaptureRect || !_captureRect.IntersectsWith(tl))) { - destinationLocation = new Point(-zoomOffset.X - zoomSize.Width, -zoomOffset.Y - zoomSize.Width); + destinationLocation = new NativePoint(-zoomOffset.X - zoomSize.Width, -zoomOffset.Y - zoomSize.Width); } - if (destinationLocation == Point.Empty && !allowZoomOverCaptureRect) + if (destinationLocation == NativePoint.Empty && !allowZoomOverCaptureRect) { VerifyZoomAnimation(pos, true); } else { - _zoomAnimator.ChangeDestination(new Rectangle(destinationLocation, zoomSize)); + _zoomAnimator.ChangeDestination(new NativeRect(destinationLocation, zoomSize)); } } @@ -849,7 +845,7 @@ namespace Greenshot.Forms /// /// /// - private void DrawZoom(Graphics graphics, Rectangle sourceRectangle, Rectangle destinationRectangle) + private void DrawZoom(Graphics graphics, NativeRect sourceRectangle, NativeRect destinationRectangle) { if (_capture.Image == null) { @@ -962,7 +958,7 @@ namespace Greenshot.Forms private void OnPaint(object sender, PaintEventArgs e) { Graphics graphics = e.Graphics; - Rectangle clipRectangle = e.ClipRectangle; + NativeRect clipRectangle = e.ClipRectangle; //graphics.BitBlt((Bitmap)buffer, Point.Empty); graphics.DrawImageUnscaled(_capture.Image, Point.Empty); @@ -1010,14 +1006,14 @@ namespace Greenshot.Forms } // Only draw Cursor if it's (partly) visible - if (_capture.Cursor != null && _capture.CursorVisible && clipRectangle.IntersectsWith(new Rectangle(_capture.CursorLocation, _capture.Cursor.Size))) + if (_capture.Cursor != null && _capture.CursorVisible && clipRectangle.IntersectsWith(new NativeRect(_capture.CursorLocation, _capture.Cursor.Size))) { graphics.DrawIcon(_capture.Cursor, _capture.CursorLocation.X, _capture.CursorLocation.Y); } if (_mouseDown || _captureMode == CaptureMode.Window || IsAnimating(_windowAnimator)) { - _captureRect.Intersect(new Rectangle(Point.Empty, _capture.ScreenBounds.Size)); // crop what is outside the screen + _captureRect = _captureRect.Intersect(new NativeRect(Point.Empty, _capture.ScreenBounds.Size)); // crop what is outside the screen var fixedRect = IsAnimating(_windowAnimator) ? _windowAnimator.Current : _captureRect; @@ -1146,7 +1142,7 @@ namespace Greenshot.Forms using (Pen pen = new Pen(Color.LightSeaGreen)) { pen.DashStyle = DashStyle.Dot; - Rectangle screenBounds = _capture.ScreenBounds; + NativeRect screenBounds = _capture.ScreenBounds; graphics.DrawLine(pen, _cursorPos.X, screenBounds.Y, _cursorPos.X, screenBounds.Height); graphics.DrawLine(pen, screenBounds.X, _cursorPos.Y, screenBounds.Width, _cursorPos.Y); } @@ -1175,10 +1171,10 @@ namespace Greenshot.Forms const int zoomSourceWidth = 25; const int zoomSourceHeight = 25; - Rectangle sourceRectangle = new Rectangle(_cursorPos.X - zoomSourceWidth / 2, _cursorPos.Y - zoomSourceHeight / 2, zoomSourceWidth, zoomSourceHeight); + var sourceRectangle = new NativeRect(_cursorPos.X - zoomSourceWidth / 2, _cursorPos.Y - zoomSourceHeight / 2, zoomSourceWidth, zoomSourceHeight); - Rectangle destinationRectangle = _zoomAnimator.Current; - destinationRectangle.Offset(_cursorPos); + var destinationRectangle = _zoomAnimator.Current; + destinationRectangle = destinationRectangle.Offset(_cursorPos); DrawZoom(graphics, sourceRectangle, destinationRectangle); } } diff --git a/src/Greenshot/Forms/MainForm.Designer.cs b/src/Greenshot/Forms/MainForm.Designer.cs index 015e0060b..b558bf4f9 100644 --- a/src/Greenshot/Forms/MainForm.Designer.cs +++ b/src/Greenshot/Forms/MainForm.Designer.cs @@ -106,7 +106,7 @@ namespace Greenshot.Forms { this.contextMenu.Name = "contextMenu"; this.contextMenu.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.ContextMenuClosing); this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuOpening); - this.contextMenu.Renderer = new Greenshot.Controls.ContextMenuToolStripProfessionalRenderer(); + this.contextMenu.Renderer = new Greenshot.Controls.ContextMenuToolStripProfessionalRenderer(this); // // contextmenu_capturearea // @@ -204,7 +204,7 @@ namespace Greenshot.Forms { // contextmenu_quicksettings // this.contextmenu_quicksettings.Name = "contextmenu_quicksettings"; - this.contextmenu_quicksettings.Size = new System.Drawing.Size(170, coreConfiguration.ScaledIconSize.Height + 8); + this.contextmenu_quicksettings.Size = new System.Drawing.Size(170, coreConfiguration.IconSize.Height + 8); // // contextmenu_settings // diff --git a/src/Greenshot/Forms/MainForm.cs b/src/Greenshot/Forms/MainForm.cs index f1c4f8bbc..081084d0b 100644 --- a/src/Greenshot/Forms/MainForm.cs +++ b/src/Greenshot/Forms/MainForm.cs @@ -32,17 +32,23 @@ using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.Integration; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.DesktopWindowsManager; +using Dapplo.Windows.Dpi; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.User32; using Greenshot.Base; using Greenshot.Base.Controls; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; +using Greenshot.Base.Core.FileFormatHandlers; using Greenshot.Base.Help; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Plugin; -using Greenshot.Base.UnmanagedHelpers; using Greenshot.Configuration; using Greenshot.Destinations; +using Greenshot.Editor; using Greenshot.Editor.Destinations; using Greenshot.Editor.Drawing; using Greenshot.Editor.Forms; @@ -56,7 +62,7 @@ namespace Greenshot.Forms /// /// This is the MainForm, the shell of Greenshot /// - public partial class MainForm : BaseForm, IGreenshotMainForm, ICaptureHelper + public partial class MainForm : BaseForm, IGreenshotMainForm, ICaptureHelper, IProvideDeviceDpi { private static ILog LOG; private static ResourceMutex _applicationMutex; @@ -114,11 +120,11 @@ namespace Greenshot.Forms if (argument.ToLower().Equals("/help") || argument.ToLower().Equals("/h") || argument.ToLower().Equals("/?")) { // Try to attach to the console - bool attachedToConsole = Kernel32.AttachConsole(Kernel32.ATTACHCONSOLE_ATTACHPARENTPROCESS); + bool attachedToConsole = Kernel32Api.AttachConsole(); // If attach didn't work, open a console if (!attachedToConsole) { - Kernel32.AllocConsole(); + Kernel32Api.AllocConsole(); } var helpOutput = new StringBuilder(); @@ -162,7 +168,7 @@ namespace Greenshot.Forms if (argument.ToLower().Equals("/exit")) { - // unregister application on uninstall (allow uninstall) + // un-register application on uninstall (allow uninstall) try { LOG.Info("Sending all instances the exit command."); @@ -248,7 +254,7 @@ namespace Greenshot.Forms { try { - instanceInfo.Append(index++ + ": ").AppendLine(Kernel32.GetProcessPath(greenshotProcess.Id)); + instanceInfo.Append(index++ + ": ").AppendLine(Kernel32Api.GetProcessPath(greenshotProcess.Id)); if (currentProcessId == greenshotProcess.Id) { matchedThisProcess = true; @@ -265,7 +271,7 @@ namespace Greenshot.Forms if (!matchedThisProcess) { using Process currentProcess = Process.GetCurrentProcess(); - instanceInfo.Append(index + ": ").AppendLine(Kernel32.GetProcessPath(currentProcess.Id)); + instanceInfo.Append(index + ": ").AppendLine(Kernel32Api.GetProcessPath(currentProcess.Id)); } // A dirty fix to make sure the message box is visible as a Greenshot window on the taskbar @@ -376,8 +382,7 @@ namespace Greenshot.Forms { var uiContext = TaskScheduler.FromCurrentSynchronizationContext(); SimpleServiceProvider.Current.AddService(uiContext); - DpiChanged += (e, o) => ApplyDpiScaling(); - + // The most important form is this SimpleServiceProvider.Current.AddService
(this); // Also as itself @@ -387,6 +392,8 @@ namespace Greenshot.Forms _instance = this; + EditorInitialize.Initialize(); + // Factory for surface objects ISurface SurfaceFactory() => new Surface(); @@ -499,7 +506,7 @@ namespace Greenshot.Forms // Make Greenshot use less memory after startup if (_conf.MinimizeWorkingSetSize) { - PsAPI.EmptyWorkingSet(); + PsApi.EmptyWorkingSet(); } } @@ -524,7 +531,7 @@ namespace Greenshot.Forms int len = 250; var stringBuilder = new StringBuilder(len); using var proc = Process.GetCurrentProcess(); - var err = Kernel32.GetPackageFullName(proc.Handle, ref len, stringBuilder); + var err = Kernel32Api.GetPackageFullName(proc.Handle, ref len, stringBuilder); if (err != 0) { useEditor = true; @@ -740,7 +747,7 @@ namespace Greenshot.Forms return; } - ApplyDpiScaling(); + DpiChangedHandler(96, DeviceDpi); string ieExePath = PluginUtils.GetExePath("iexplore.exe"); if (!string.IsNullOrEmpty(ieExePath)) { @@ -751,10 +758,10 @@ namespace Greenshot.Forms /// /// Modify the DPI settings depending in the current value /// - private void ApplyDpiScaling() + protected override void DpiChangedHandler(int oldDpi, int newDpi) { - var scaledIconSize = DpiHelper.ScaleWithDpi(coreConfiguration.IconSize, DpiHelper.GetDpi(Handle)); - contextMenu.ImageScalingSize = scaledIconSize; + var newSize = DpiCalculator.ScaleWithDpi(coreConfiguration.IconSize, newDpi); + contextMenu.ImageScalingSize = newSize; } /// @@ -922,11 +929,11 @@ namespace Greenshot.Forms { Hide(); ShowInTaskbar = false; - - - using var loProcess = Process.GetCurrentProcess(); - loProcess.MaxWorkingSet = (IntPtr)750000; - loProcess.MinWorkingSet = (IntPtr)300000; + + // TODO: Do we really need this? + //using var loProcess = Process.GetCurrentProcess(); + //loProcess.MaxWorkingSet = (IntPtr)750000; + //loProcess.MinWorkingSet = (IntPtr)300000; } private void CaptureRegion() @@ -936,9 +943,12 @@ namespace Greenshot.Forms private void CaptureFile(IDestination destination = null) { + var fileFormatHandlers = SimpleServiceProvider.Current.GetAllInstances(); + var extensions = fileFormatHandlers.ExtensionsFor(FileFormatHandlerActions.LoadFromStream).Select(e => $"*{e}").ToList(); + var openFileDialog = new OpenFileDialog { - Filter = @"Image files (*.greenshot, *.png, *.jpg, *.gif, *.bmp, *.ico, *.tiff, *.wmf)|*.greenshot; *.png; *.jpg; *.jpeg; *.gif; *.bmp; *.ico; *.tiff; *.tif; *.wmf" + Filter = @$"Image files ({string.Join(", ", extensions)})|{string.Join("; ", extensions)}" }; if (openFileDialog.ShowDialog() != DialogResult.OK) { @@ -995,7 +1005,7 @@ namespace Greenshot.Forms var factor = DeviceDpi / 96f; contextMenu.Scale(new SizeF(factor, factor)); contextmenu_captureclipboard.Enabled = ClipboardHelper.ContainsImage(); - contextmenu_capturelastregion.Enabled = coreConfiguration.LastCapturedRegion != Rectangle.Empty; + contextmenu_capturelastregion.Enabled = coreConfiguration.LastCapturedRegion != NativeRect.Empty; // IE context menu code try @@ -1117,51 +1127,50 @@ namespace Greenshot.Forms { ToolStripMenuItem captureScreenMenuItem = (ToolStripMenuItem) sender; captureScreenMenuItem.DropDownItems.Clear(); - if (Screen.AllScreens.Length > 1) - { - Rectangle allScreensBounds = WindowCapture.GetScreenBounds(); + if (DisplayInfo.AllDisplayInfos.Length <= 1) return; - var captureScreenItem = new ToolStripMenuItem(Language.GetString(LangKey.contextmenu_capturefullscreen_all)); - captureScreenItem.Click += delegate { - BeginInvoke((MethodInvoker) delegate { - CaptureHelper.CaptureFullscreen(false, ScreenCaptureMode.FullScreen); + var allScreensBounds = DisplayInfo.ScreenBounds; + + var captureScreenItem = new ToolStripMenuItem(Language.GetString(LangKey.contextmenu_capturefullscreen_all)); + captureScreenItem.Click += delegate { + BeginInvoke((MethodInvoker) delegate { + CaptureHelper.CaptureFullscreen(false, ScreenCaptureMode.FullScreen); + }); + }; + + captureScreenMenuItem.DropDownItems.Add(captureScreenItem); + foreach (var displayInfo in DisplayInfo.AllDisplayInfos) + { + var displayToCapture = displayInfo; + string deviceAlignment = displayToCapture.DeviceName; + + if (displayInfo.Bounds.Top == allScreensBounds.Top && displayInfo.Bounds.Bottom != allScreensBounds.Bottom) + { + deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_top); + } + else if (displayInfo.Bounds.Top != allScreensBounds.Top && displayInfo.Bounds.Bottom == allScreensBounds.Bottom) + { + deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_bottom); + } + + if (displayInfo.Bounds.Left == allScreensBounds.Left && displayInfo.Bounds.Right != allScreensBounds.Right) + { + deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_left); + } + else if (displayInfo.Bounds.Left != allScreensBounds.Left && displayInfo.Bounds.Right == allScreensBounds.Right) + { + deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_right); + } + + captureScreenItem = new ToolStripMenuItem(deviceAlignment); + captureScreenItem.Click += delegate + { + BeginInvoke((MethodInvoker) delegate + { + CaptureHelper.CaptureRegion(false, displayToCapture.Bounds); }); }; - captureScreenMenuItem.DropDownItems.Add(captureScreenItem); - foreach (Screen screen in Screen.AllScreens) - { - Screen screenToCapture = screen; - string deviceAlignment = screenToCapture.DeviceName; - - if (screen.Bounds.Top == allScreensBounds.Top && screen.Bounds.Bottom != allScreensBounds.Bottom) - { - deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_top); - } - else if (screen.Bounds.Top != allScreensBounds.Top && screen.Bounds.Bottom == allScreensBounds.Bottom) - { - deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_bottom); - } - - if (screen.Bounds.Left == allScreensBounds.Left && screen.Bounds.Right != allScreensBounds.Right) - { - deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_left); - } - else if (screen.Bounds.Left != allScreensBounds.Left && screen.Bounds.Right == allScreensBounds.Right) - { - deviceAlignment += " " + Language.GetString(LangKey.contextmenu_capturefullscreen_right); - } - - captureScreenItem = new ToolStripMenuItem(deviceAlignment); - captureScreenItem.Click += delegate - { - BeginInvoke((MethodInvoker) delegate - { - CaptureHelper.CaptureRegion(false, screenToCapture.Bounds); - }); - }; - captureScreenMenuItem.DropDownItems.Add(captureScreenItem); - } } } @@ -1230,7 +1239,7 @@ namespace Greenshot.Forms { menuItem.DropDownItems.Clear(); // check if thumbnailPreview is enabled and DWM is enabled - bool thumbnailPreview = _conf.ThumnailPreview && DWM.IsDwmEnabled; + bool thumbnailPreview = _conf.ThumnailPreview && DwmApi.IsDwmEnabled; foreach (var window in WindowDetails.GetTopLevelWindows()) { @@ -1492,7 +1501,7 @@ namespace Greenshot.Forms if (!_conf.Values["Destinations"].IsFixed) { // screenshot destination - selectList = new ToolStripMenuSelectList("destinations", true) + selectList = new ToolStripMenuSelectList("destinations", true, this) { Text = Language.GetString(LangKey.settings_destination) }; @@ -1509,7 +1518,7 @@ namespace Greenshot.Forms if (!_conf.Values["WindowCaptureMode"].IsFixed) { // Capture Modes - selectList = new ToolStripMenuSelectList("capturemodes", false) + selectList = new ToolStripMenuSelectList("capturemodes", false, this) { Text = Language.GetString(LangKey.settings_window_capture_mode) }; @@ -1524,7 +1533,7 @@ namespace Greenshot.Forms } // print options - selectList = new ToolStripMenuSelectList("printoptions", true) + selectList = new ToolStripMenuSelectList("printoptions", true, this) { Text = Language.GetString(LangKey.settings_printoptions) }; @@ -1549,7 +1558,7 @@ namespace Greenshot.Forms } // effects - selectList = new ToolStripMenuSelectList("effects", true) + selectList = new ToolStripMenuSelectList("effects", true, this) { Text = Language.GetString(LangKey.settings_visualization) }; @@ -1904,7 +1913,7 @@ namespace Greenshot.Forms LOG.Error("Error closing application!", e); } - ImageOutput.RemoveTmpFiles(); + ImageIO.RemoveTmpFiles(); // Store any open configuration changes try diff --git a/src/Greenshot/Forms/PrintOptionsDialog.Designer.cs b/src/Greenshot/Forms/PrintOptionsDialog.Designer.cs index 9cb5cc43d..9f9d0a13a 100644 --- a/src/Greenshot/Forms/PrintOptionsDialog.Designer.cs +++ b/src/Greenshot/Forms/PrintOptionsDialog.Designer.cs @@ -89,7 +89,7 @@ namespace Greenshot.Forms this.checkboxAllowShrink.LanguageKey = "printoptions_allowshrink"; this.checkboxAllowShrink.Location = new System.Drawing.Point(13, 23); this.checkboxAllowShrink.Name = "checkboxAllowShrink"; - this.checkboxAllowShrink.PropertyName = "OutputPrintAllowShrink"; + this.checkboxAllowShrink.PropertyName = nameof(coreConfiguration.OutputPrintAllowShrink); this.checkboxAllowShrink.Size = new System.Drawing.Size(168, 17); this.checkboxAllowShrink.TabIndex = 2; this.checkboxAllowShrink.Text = "Shrink printout to fit paper size"; @@ -103,7 +103,7 @@ namespace Greenshot.Forms this.checkboxAllowEnlarge.LanguageKey = "printoptions_allowenlarge"; this.checkboxAllowEnlarge.Location = new System.Drawing.Point(13, 46); this.checkboxAllowEnlarge.Name = "checkboxAllowEnlarge"; - this.checkboxAllowEnlarge.PropertyName = "OutputPrintAllowEnlarge"; + this.checkboxAllowEnlarge.PropertyName = nameof(coreConfiguration.OutputPrintAllowEnlarge); this.checkboxAllowEnlarge.Size = new System.Drawing.Size(174, 17); this.checkboxAllowEnlarge.TabIndex = 3; this.checkboxAllowEnlarge.Text = "Enlarge printout to fit paper size"; @@ -117,7 +117,7 @@ namespace Greenshot.Forms this.checkboxAllowCenter.LanguageKey = "printoptions_allowcenter"; this.checkboxAllowCenter.Location = new System.Drawing.Point(13, 92); this.checkboxAllowCenter.Name = "checkboxAllowCenter"; - this.checkboxAllowCenter.PropertyName = "OutputPrintCenter"; + this.checkboxAllowCenter.PropertyName = nameof(coreConfiguration.OutputPrintCenter); this.checkboxAllowCenter.Size = new System.Drawing.Size(137, 17); this.checkboxAllowCenter.TabIndex = 5; this.checkboxAllowCenter.Text = "Center printout on page"; @@ -131,7 +131,7 @@ namespace Greenshot.Forms this.checkboxAllowRotate.LanguageKey = "printoptions_allowrotate"; this.checkboxAllowRotate.Location = new System.Drawing.Point(13, 69); this.checkboxAllowRotate.Name = "checkboxAllowRotate"; - this.checkboxAllowRotate.PropertyName = "OutputPrintAllowRotate"; + this.checkboxAllowRotate.PropertyName = nameof(coreConfiguration.OutputPrintAllowRotate); this.checkboxAllowRotate.Size = new System.Drawing.Size(187, 17); this.checkboxAllowRotate.TabIndex = 4; this.checkboxAllowRotate.Text = "Rotate printout to page orientation"; @@ -158,7 +158,7 @@ namespace Greenshot.Forms this.checkboxDateTime.LanguageKey = "printoptions_timestamp"; this.checkboxDateTime.Location = new System.Drawing.Point(13, 115); this.checkboxDateTime.Name = "checkboxDateTime"; - this.checkboxDateTime.PropertyName = "OutputPrintFooter"; + this.checkboxDateTime.PropertyName = nameof(coreConfiguration.OutputPrintFooter); this.checkboxDateTime.Size = new System.Drawing.Size(187, 17); this.checkboxDateTime.TabIndex = 6; this.checkboxDateTime.Text = "Print date / time at bottom of page"; @@ -184,7 +184,7 @@ namespace Greenshot.Forms this.checkboxPrintInverted.LanguageKey = "printoptions_inverted"; this.checkboxPrintInverted.Location = new System.Drawing.Point(13, 88); this.checkboxPrintInverted.Name = "checkboxPrintInverted"; - this.checkboxPrintInverted.PropertyName = "OutputPrintInverted"; + this.checkboxPrintInverted.PropertyName = nameof(coreConfiguration.OutputPrintInverted); this.checkboxPrintInverted.Size = new System.Drawing.Size(141, 17); this.checkboxPrintInverted.TabIndex = 14; this.checkboxPrintInverted.Text = "Print with inverted colors"; @@ -198,7 +198,7 @@ namespace Greenshot.Forms this.radioBtnGrayScale.LanguageKey = "printoptions_printgrayscale"; this.radioBtnGrayScale.Location = new System.Drawing.Point(13, 42); this.radioBtnGrayScale.Name = "radioBtnGrayScale"; - this.radioBtnGrayScale.PropertyName = "OutputPrintGrayscale"; + this.radioBtnGrayScale.PropertyName = nameof(coreConfiguration.OutputPrintGrayscale); this.radioBtnGrayScale.Size = new System.Drawing.Size(137, 17); this.radioBtnGrayScale.TabIndex = 12; this.radioBtnGrayScale.Text = "Force grayscale printing"; @@ -212,7 +212,7 @@ namespace Greenshot.Forms this.radioBtnMonochrome.LanguageKey = "printoptions_printmonochrome"; this.radioBtnMonochrome.Location = new System.Drawing.Point(13, 65); this.radioBtnMonochrome.Name = "radioBtnMonochrome"; - this.radioBtnMonochrome.PropertyName = "OutputPrintMonochrome"; + this.radioBtnMonochrome.PropertyName = nameof(coreConfiguration.OutputPrintMonochrome); this.radioBtnMonochrome.Size = new System.Drawing.Size(148, 17); this.radioBtnMonochrome.TabIndex = 13; this.radioBtnMonochrome.Text = "Force black/white printing"; @@ -255,7 +255,6 @@ namespace Greenshot.Forms this.radioBtnColorPrint.LanguageKey = "printoptions_printcolor"; this.radioBtnColorPrint.Location = new System.Drawing.Point(13, 19); this.radioBtnColorPrint.Name = "radioBtnColorPrint"; - this.radioBtnColorPrint.PropertyName = "OutputPrintColor"; this.radioBtnColorPrint.Size = new System.Drawing.Size(90, 17); this.radioBtnColorPrint.TabIndex = 11; this.radioBtnColorPrint.TextAlign = System.Drawing.ContentAlignment.TopLeft; diff --git a/src/Greenshot/Forms/SettingsForm.Designer.cs b/src/Greenshot/Forms/SettingsForm.Designer.cs index e8f284850..6bea356df 100644 --- a/src/Greenshot/Forms/SettingsForm.Designer.cs +++ b/src/Greenshot/Forms/SettingsForm.Designer.cs @@ -20,6 +20,8 @@ */ using Greenshot.Base.Controls; +using Greenshot.Base.Core; +using Greenshot.Editor.Configuration; using Greenshot.Editor.Controls; namespace Greenshot.Forms { @@ -235,7 +237,7 @@ namespace Greenshot.Forms { // this.textbox_screenshotname.Location = new System.Drawing.Point(138, 41); this.textbox_screenshotname.Name = "textbox_screenshotname"; - this.textbox_screenshotname.PropertyName = "OutputFileFilenamePattern"; + this.textbox_screenshotname.PropertyName = nameof(CoreConfiguration.OutputFileFilenamePattern); this.textbox_screenshotname.Size = new System.Drawing.Size(233, 20); this.textbox_screenshotname.TabIndex = 3; this.textbox_screenshotname.TextChanged += new System.EventHandler(this.FilenamePatternChanged); @@ -264,7 +266,7 @@ namespace Greenshot.Forms { this.combobox_primaryimageformat.FormattingEnabled = true; this.combobox_primaryimageformat.Location = new System.Drawing.Point(138, 64); this.combobox_primaryimageformat.Name = "combobox_primaryimageformat"; - this.combobox_primaryimageformat.PropertyName = "OutputFileFormat"; + this.combobox_primaryimageformat.PropertyName = nameof(CoreConfiguration.OutputFileFormat); this.combobox_primaryimageformat.Size = new System.Drawing.Size(268, 21); this.combobox_primaryimageformat.TabIndex = 5; // @@ -309,7 +311,7 @@ namespace Greenshot.Forms { this.checkbox_copypathtoclipboard.LanguageKey = "settings_copypathtoclipboard"; this.checkbox_copypathtoclipboard.Location = new System.Drawing.Point(12, 89); this.checkbox_copypathtoclipboard.Name = "checkbox_copypathtoclipboard"; - this.checkbox_copypathtoclipboard.PropertyName = "OutputFileCopyPathToClipboard"; + this.checkbox_copypathtoclipboard.PropertyName = nameof(CoreConfiguration.OutputFileCopyPathToClipboard); this.checkbox_copypathtoclipboard.Size = new System.Drawing.Size(394, 24); this.checkbox_copypathtoclipboard.TabIndex = 6; this.checkbox_copypathtoclipboard.UseVisualStyleBackColor = true; @@ -374,7 +376,7 @@ namespace Greenshot.Forms { this.checkbox_reducecolors.LanguageKey = "settings_reducecolors"; this.checkbox_reducecolors.Location = new System.Drawing.Point(12, 72); this.checkbox_reducecolors.Name = "checkbox_reducecolors"; - this.checkbox_reducecolors.PropertyName = "OutputFileReduceColors"; + this.checkbox_reducecolors.PropertyName = nameof(CoreConfiguration.OutputFileReduceColors); this.checkbox_reducecolors.Size = new System.Drawing.Size(394, 25); this.checkbox_reducecolors.TabIndex = 10; this.checkbox_reducecolors.UseVisualStyleBackColor = true; @@ -384,7 +386,7 @@ namespace Greenshot.Forms { this.checkbox_alwaysshowqualitydialog.LanguageKey = "settings_alwaysshowqualitydialog"; this.checkbox_alwaysshowqualitydialog.Location = new System.Drawing.Point(12, 50); this.checkbox_alwaysshowqualitydialog.Name = "checkbox_alwaysshowqualitydialog"; - this.checkbox_alwaysshowqualitydialog.PropertyName = "OutputFilePromptQuality"; + this.checkbox_alwaysshowqualitydialog.PropertyName = nameof(CoreConfiguration.OutputFilePromptQuality); this.checkbox_alwaysshowqualitydialog.Size = new System.Drawing.Size(394, 25); this.checkbox_alwaysshowqualitydialog.TabIndex = 9; this.checkbox_alwaysshowqualitydialog.UseVisualStyleBackColor = true; @@ -526,7 +528,7 @@ namespace Greenshot.Forms { this.checkbox_usedefaultproxy.LanguageKey = "settings_usedefaultproxy"; this.checkbox_usedefaultproxy.Location = new System.Drawing.Point(7, 11); this.checkbox_usedefaultproxy.Name = "checkbox_usedefaultproxy"; - this.checkbox_usedefaultproxy.PropertyName = "UseProxy"; + this.checkbox_usedefaultproxy.PropertyName = nameof(CoreConfiguration.UseProxy); this.checkbox_usedefaultproxy.Size = new System.Drawing.Size(397, 25); this.checkbox_usedefaultproxy.TabIndex = 7; this.checkbox_usedefaultproxy.UseVisualStyleBackColor = true; @@ -564,7 +566,7 @@ namespace Greenshot.Forms { this.lastregion_hotkeyControl.HotkeyModifiers = System.Windows.Forms.Keys.None; this.lastregion_hotkeyControl.Location = new System.Drawing.Point(224, 94); this.lastregion_hotkeyControl.Name = "lastregion_hotkeyControl"; - this.lastregion_hotkeyControl.PropertyName = "LastregionHotkey"; + this.lastregion_hotkeyControl.PropertyName = nameof(CoreConfiguration.LastregionHotkey); this.lastregion_hotkeyControl.Size = new System.Drawing.Size(179, 20); this.lastregion_hotkeyControl.TabIndex = 5; // @@ -582,7 +584,7 @@ namespace Greenshot.Forms { this.ie_hotkeyControl.HotkeyModifiers = System.Windows.Forms.Keys.None; this.ie_hotkeyControl.Location = new System.Drawing.Point(224, 120); this.ie_hotkeyControl.Name = "ie_hotkeyControl"; - this.ie_hotkeyControl.PropertyName = "IEHotkey"; + this.ie_hotkeyControl.PropertyName = nameof(CoreConfiguration.IEHotkey); this.ie_hotkeyControl.Size = new System.Drawing.Size(179, 20); this.ie_hotkeyControl.TabIndex = 6; // @@ -616,7 +618,7 @@ namespace Greenshot.Forms { this.region_hotkeyControl.HotkeyModifiers = System.Windows.Forms.Keys.None; this.region_hotkeyControl.Location = new System.Drawing.Point(224, 68); this.region_hotkeyControl.Name = "region_hotkeyControl"; - this.region_hotkeyControl.PropertyName = "RegionHotkey"; + this.region_hotkeyControl.PropertyName = nameof(CoreConfiguration.RegionHotkey); this.region_hotkeyControl.Size = new System.Drawing.Size(179, 20); this.region_hotkeyControl.TabIndex = 4; // @@ -626,7 +628,7 @@ namespace Greenshot.Forms { this.window_hotkeyControl.HotkeyModifiers = System.Windows.Forms.Keys.None; this.window_hotkeyControl.Location = new System.Drawing.Point(224, 42); this.window_hotkeyControl.Name = "window_hotkeyControl"; - this.window_hotkeyControl.PropertyName = "WindowHotkey"; + this.window_hotkeyControl.PropertyName = nameof(CoreConfiguration.WindowHotkey); this.window_hotkeyControl.Size = new System.Drawing.Size(179, 20); this.window_hotkeyControl.TabIndex = 3; // @@ -636,7 +638,7 @@ namespace Greenshot.Forms { this.fullscreen_hotkeyControl.HotkeyModifiers = System.Windows.Forms.Keys.None; this.fullscreen_hotkeyControl.Location = new System.Drawing.Point(224, 16); this.fullscreen_hotkeyControl.Name = "fullscreen_hotkeyControl"; - this.fullscreen_hotkeyControl.PropertyName = "FullscreenHotkey"; + this.fullscreen_hotkeyControl.PropertyName = nameof(CoreConfiguration.FullscreenHotkey); this.fullscreen_hotkeyControl.Size = new System.Drawing.Size(179, 20); this.fullscreen_hotkeyControl.TabIndex = 2; // @@ -668,7 +670,7 @@ namespace Greenshot.Forms { this.checkbox_editor_match_capture_size.LanguageKey = "editor_match_capture_size"; this.checkbox_editor_match_capture_size.Location = new System.Drawing.Point(6, 19); this.checkbox_editor_match_capture_size.Name = "checkbox_editor_match_capture_size"; - this.checkbox_editor_match_capture_size.PropertyName = "MatchSizeToCapture"; + this.checkbox_editor_match_capture_size.PropertyName = nameof(EditorConfiguration.MatchSizeToCapture); this.checkbox_editor_match_capture_size.SectionName = "Editor"; this.checkbox_editor_match_capture_size.Size = new System.Drawing.Size(397, 24); this.checkbox_editor_match_capture_size.TabIndex = 11; @@ -689,7 +691,7 @@ namespace Greenshot.Forms { this.checkbox_ie_capture.LanguageKey = "settings_iecapture"; this.checkbox_ie_capture.Location = new System.Drawing.Point(6, 19); this.checkbox_ie_capture.Name = "checkbox_ie_capture"; - this.checkbox_ie_capture.PropertyName = "IECapture"; + this.checkbox_ie_capture.PropertyName = nameof(CoreConfiguration.IECapture); this.checkbox_ie_capture.Size = new System.Drawing.Size(404, 24); this.checkbox_ie_capture.TabIndex = 10; this.checkbox_ie_capture.UseVisualStyleBackColor = true; @@ -732,7 +734,7 @@ namespace Greenshot.Forms { this.radiobuttonInteractiveCapture.LanguageKey = "settings_capture_windows_interactive"; this.radiobuttonInteractiveCapture.Location = new System.Drawing.Point(11, 20); this.radiobuttonInteractiveCapture.Name = "radiobuttonInteractiveCapture"; - this.radiobuttonInteractiveCapture.PropertyName = "CaptureWindowsInteractive"; + this.radiobuttonInteractiveCapture.PropertyName = nameof(CoreConfiguration.CaptureWindowsInteractive); this.radiobuttonInteractiveCapture.Size = new System.Drawing.Size(203, 17); this.radiobuttonInteractiveCapture.TabIndex = 6; this.radiobuttonInteractiveCapture.TabStop = true; @@ -770,7 +772,7 @@ namespace Greenshot.Forms { this.checkbox_zoomer.LanguageKey = "settings_zoom"; this.checkbox_zoomer.Location = new System.Drawing.Point(11, 79); this.checkbox_zoomer.Name = "checkbox_zoomer"; - this.checkbox_zoomer.PropertyName = "ZoomerEnabled"; + this.checkbox_zoomer.PropertyName = nameof(CoreConfiguration.ZoomerEnabled); this.checkbox_zoomer.Size = new System.Drawing.Size(399, 24); this.checkbox_zoomer.TabIndex = 4; this.checkbox_zoomer.UseVisualStyleBackColor = true; @@ -780,7 +782,7 @@ namespace Greenshot.Forms { this.checkbox_notifications.LanguageKey = "settings_shownotify"; this.checkbox_notifications.Location = new System.Drawing.Point(11, 59); this.checkbox_notifications.Name = "checkbox_notifications"; - this.checkbox_notifications.PropertyName = "ShowTrayNotification"; + this.checkbox_notifications.PropertyName = nameof(CoreConfiguration.ShowTrayNotification); this.checkbox_notifications.Size = new System.Drawing.Size(399, 24); this.checkbox_notifications.TabIndex = 3; this.checkbox_notifications.UseVisualStyleBackColor = true; @@ -790,7 +792,7 @@ namespace Greenshot.Forms { this.checkbox_playsound.LanguageKey = "settings_playsound"; this.checkbox_playsound.Location = new System.Drawing.Point(11, 39); this.checkbox_playsound.Name = "checkbox_playsound"; - this.checkbox_playsound.PropertyName = "PlayCameraSound"; + this.checkbox_playsound.PropertyName = nameof(CoreConfiguration.PlayCameraSound); this.checkbox_playsound.Size = new System.Drawing.Size(399, 24); this.checkbox_playsound.TabIndex = 2; this.checkbox_playsound.UseVisualStyleBackColor = true; @@ -800,7 +802,7 @@ namespace Greenshot.Forms { this.checkbox_capture_mousepointer.LanguageKey = "settings_capture_mousepointer"; this.checkbox_capture_mousepointer.Location = new System.Drawing.Point(11, 19); this.checkbox_capture_mousepointer.Name = "checkbox_capture_mousepointer"; - this.checkbox_capture_mousepointer.PropertyName = "CaptureMousepointer"; + this.checkbox_capture_mousepointer.PropertyName = nameof(CoreConfiguration.CaptureMousepointer); this.checkbox_capture_mousepointer.Size = new System.Drawing.Size(394, 24); this.checkbox_capture_mousepointer.TabIndex = 1; this.checkbox_capture_mousepointer.UseVisualStyleBackColor = true; @@ -887,7 +889,7 @@ namespace Greenshot.Forms { this.checkboxPrintInverted.LanguageKey = "printoptions_inverted"; this.checkboxPrintInverted.Location = new System.Drawing.Point(13, 88); this.checkboxPrintInverted.Name = "checkboxPrintInverted"; - this.checkboxPrintInverted.PropertyName = "OutputPrintInverted"; + this.checkboxPrintInverted.PropertyName = nameof(CoreConfiguration.OutputPrintInverted); this.checkboxPrintInverted.Size = new System.Drawing.Size(141, 17); this.checkboxPrintInverted.TabIndex = 14; this.checkboxPrintInverted.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -900,7 +902,6 @@ namespace Greenshot.Forms { this.radioBtnColorPrint.LanguageKey = "printoptions_printcolor"; this.radioBtnColorPrint.Location = new System.Drawing.Point(13, 19); this.radioBtnColorPrint.Name = "radioBtnColorPrint"; - this.radioBtnColorPrint.PropertyName = "OutputPrintColor"; this.radioBtnColorPrint.Size = new System.Drawing.Size(90, 17); this.radioBtnColorPrint.TabIndex = 11; this.radioBtnColorPrint.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -913,7 +914,7 @@ namespace Greenshot.Forms { this.radioBtnGrayScale.LanguageKey = "printoptions_printgrayscale"; this.radioBtnGrayScale.Location = new System.Drawing.Point(13, 42); this.radioBtnGrayScale.Name = "radioBtnGrayScale"; - this.radioBtnGrayScale.PropertyName = "OutputPrintGrayscale"; + this.radioBtnGrayScale.PropertyName = nameof(coreConfiguration.OutputPrintGrayscale); this.radioBtnGrayScale.Size = new System.Drawing.Size(137, 17); this.radioBtnGrayScale.TabIndex = 12; this.radioBtnGrayScale.Text = "Force grayscale printing"; @@ -927,7 +928,7 @@ namespace Greenshot.Forms { this.radioBtnMonochrome.LanguageKey = "printoptions_printmonochrome"; this.radioBtnMonochrome.Location = new System.Drawing.Point(13, 65); this.radioBtnMonochrome.Name = "radioBtnMonochrome"; - this.radioBtnMonochrome.PropertyName = "OutputPrintMonochrome"; + this.radioBtnMonochrome.PropertyName = nameof(coreConfiguration.OutputPrintMonochrome); this.radioBtnMonochrome.Size = new System.Drawing.Size(148, 17); this.radioBtnMonochrome.TabIndex = 13; this.radioBtnMonochrome.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -954,7 +955,7 @@ namespace Greenshot.Forms { this.checkboxDateTime.LanguageKey = "printoptions_timestamp"; this.checkboxDateTime.Location = new System.Drawing.Point(13, 115); this.checkboxDateTime.Name = "checkboxDateTime"; - this.checkboxDateTime.PropertyName = "OutputPrintFooter"; + this.checkboxDateTime.PropertyName = nameof(coreConfiguration.OutputPrintFooter); this.checkboxDateTime.Size = new System.Drawing.Size(187, 17); this.checkboxDateTime.TabIndex = 6; this.checkboxDateTime.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -967,7 +968,7 @@ namespace Greenshot.Forms { this.checkboxAllowShrink.LanguageKey = "printoptions_allowshrink"; this.checkboxAllowShrink.Location = new System.Drawing.Point(13, 23); this.checkboxAllowShrink.Name = "checkboxAllowShrink"; - this.checkboxAllowShrink.PropertyName = "OutputPrintAllowShrink"; + this.checkboxAllowShrink.PropertyName = nameof(coreConfiguration.OutputPrintAllowShrink); this.checkboxAllowShrink.Size = new System.Drawing.Size(168, 17); this.checkboxAllowShrink.TabIndex = 2; this.checkboxAllowShrink.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -980,7 +981,7 @@ namespace Greenshot.Forms { this.checkboxAllowEnlarge.LanguageKey = "printoptions_allowenlarge"; this.checkboxAllowEnlarge.Location = new System.Drawing.Point(13, 46); this.checkboxAllowEnlarge.Name = "checkboxAllowEnlarge"; - this.checkboxAllowEnlarge.PropertyName = "OutputPrintAllowEnlarge"; + this.checkboxAllowEnlarge.PropertyName = nameof(coreConfiguration.OutputPrintAllowEnlarge); this.checkboxAllowEnlarge.Size = new System.Drawing.Size(174, 17); this.checkboxAllowEnlarge.TabIndex = 3; this.checkboxAllowEnlarge.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -993,7 +994,7 @@ namespace Greenshot.Forms { this.checkboxAllowRotate.LanguageKey = "printoptions_allowrotate"; this.checkboxAllowRotate.Location = new System.Drawing.Point(13, 69); this.checkboxAllowRotate.Name = "checkboxAllowRotate"; - this.checkboxAllowRotate.PropertyName = "OutputPrintAllowRotate"; + this.checkboxAllowRotate.PropertyName = nameof(coreConfiguration.OutputPrintAllowRotate); this.checkboxAllowRotate.Size = new System.Drawing.Size(187, 17); this.checkboxAllowRotate.TabIndex = 4; this.checkboxAllowRotate.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -1006,7 +1007,7 @@ namespace Greenshot.Forms { this.checkboxAllowCenter.LanguageKey = "printoptions_allowcenter"; this.checkboxAllowCenter.Location = new System.Drawing.Point(13, 92); this.checkboxAllowCenter.Name = "checkboxAllowCenter"; - this.checkboxAllowCenter.PropertyName = "OutputPrintCenter"; + this.checkboxAllowCenter.PropertyName = nameof(coreConfiguration.OutputPrintCenter); this.checkboxAllowCenter.Size = new System.Drawing.Size(137, 17); this.checkboxAllowCenter.TabIndex = 5; this.checkboxAllowCenter.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -1017,7 +1018,7 @@ namespace Greenshot.Forms { this.checkbox_alwaysshowprintoptionsdialog.LanguageKey = "settings_alwaysshowprintoptionsdialog"; this.checkbox_alwaysshowprintoptionsdialog.Location = new System.Drawing.Point(19, 293); this.checkbox_alwaysshowprintoptionsdialog.Name = "checkbox_alwaysshowprintoptionsdialog"; - this.checkbox_alwaysshowprintoptionsdialog.PropertyName = "OutputPrintPromptOptions"; + this.checkbox_alwaysshowprintoptionsdialog.PropertyName = nameof(coreConfiguration.OutputPrintPromptOptions); this.checkbox_alwaysshowprintoptionsdialog.Size = new System.Drawing.Size(394, 20); this.checkbox_alwaysshowprintoptionsdialog.TabIndex = 15; this.checkbox_alwaysshowprintoptionsdialog.Text = "Show print options dialog every time an image is printed"; @@ -1114,7 +1115,7 @@ namespace Greenshot.Forms { this.checkbox_reuseeditor.LanguageKey = "expertsettings_reuseeditorifpossible"; this.checkbox_reuseeditor.Location = new System.Drawing.Point(10, 225); this.checkbox_reuseeditor.Name = "checkbox_reuseeditor"; - this.checkbox_reuseeditor.PropertyName = "ReuseEditor"; + this.checkbox_reuseeditor.PropertyName = nameof(EditorConfiguration.ReuseEditor); this.checkbox_reuseeditor.SectionName = "Editor"; this.checkbox_reuseeditor.Size = new System.Drawing.Size(394, 24); this.checkbox_reuseeditor.TabIndex = 9; @@ -1125,7 +1126,7 @@ namespace Greenshot.Forms { this.checkbox_minimizememoryfootprint.LanguageKey = "expertsettings_minimizememoryfootprint"; this.checkbox_minimizememoryfootprint.Location = new System.Drawing.Point(10, 206); this.checkbox_minimizememoryfootprint.Name = "checkbox_minimizememoryfootprint"; - this.checkbox_minimizememoryfootprint.PropertyName = "MinimizeWorkingSetSize"; + this.checkbox_minimizememoryfootprint.PropertyName = nameof(coreConfiguration.MinimizeWorkingSetSize); this.checkbox_minimizememoryfootprint.Size = new System.Drawing.Size(394, 24); this.checkbox_minimizememoryfootprint.TabIndex = 8; this.checkbox_minimizememoryfootprint.UseVisualStyleBackColor = true; @@ -1135,7 +1136,7 @@ namespace Greenshot.Forms { this.checkbox_checkunstableupdates.LanguageKey = "expertsettings_checkunstableupdates"; this.checkbox_checkunstableupdates.Location = new System.Drawing.Point(10, 187); this.checkbox_checkunstableupdates.Name = "checkbox_checkunstableupdates"; - this.checkbox_checkunstableupdates.PropertyName = "CheckForUnstable"; + this.checkbox_checkunstableupdates.PropertyName = nameof(coreConfiguration.CheckForUnstable); this.checkbox_checkunstableupdates.Size = new System.Drawing.Size(394, 24); this.checkbox_checkunstableupdates.TabIndex = 7; this.checkbox_checkunstableupdates.UseVisualStyleBackColor = true; @@ -1145,7 +1146,7 @@ namespace Greenshot.Forms { this.checkbox_suppresssavedialogatclose.LanguageKey = "expertsettings_suppresssavedialogatclose"; this.checkbox_suppresssavedialogatclose.Location = new System.Drawing.Point(10, 168); this.checkbox_suppresssavedialogatclose.Name = "checkbox_suppresssavedialogatclose"; - this.checkbox_suppresssavedialogatclose.PropertyName = "SuppressSaveDialogAtClose"; + this.checkbox_suppresssavedialogatclose.PropertyName = nameof(EditorConfiguration.SuppressSaveDialogAtClose); this.checkbox_suppresssavedialogatclose.SectionName = "Editor"; this.checkbox_suppresssavedialogatclose.Size = new System.Drawing.Size(394, 24); this.checkbox_suppresssavedialogatclose.TabIndex = 6; @@ -1163,7 +1164,7 @@ namespace Greenshot.Forms { // this.textbox_counter.Location = new System.Drawing.Point(259, 282); this.textbox_counter.Name = "textbox_counter"; - this.textbox_counter.PropertyName = "OutputFileIncrementingNumber"; + this.textbox_counter.PropertyName = nameof(coreConfiguration.OutputFileIncrementingNumber); this.textbox_counter.Size = new System.Drawing.Size(141, 20); this.textbox_counter.TabIndex = 11; // @@ -1180,7 +1181,7 @@ namespace Greenshot.Forms { // this.textbox_footerpattern.Location = new System.Drawing.Point(138, 256); this.textbox_footerpattern.Name = "textbox_footerpattern"; - this.textbox_footerpattern.PropertyName = "OutputPrintFooterPattern"; + this.textbox_footerpattern.PropertyName = nameof(coreConfiguration.OutputPrintFooterPattern); this.textbox_footerpattern.Size = new System.Drawing.Size(262, 20); this.textbox_footerpattern.TabIndex = 10; // @@ -1189,7 +1190,7 @@ namespace Greenshot.Forms { this.checkbox_thumbnailpreview.LanguageKey = "expertsettings_thumbnailpreview"; this.checkbox_thumbnailpreview.Location = new System.Drawing.Point(10, 149); this.checkbox_thumbnailpreview.Name = "checkbox_thumbnailpreview"; - this.checkbox_thumbnailpreview.PropertyName = "ThumnailPreview"; + this.checkbox_thumbnailpreview.PropertyName = nameof(coreConfiguration.ThumnailPreview); this.checkbox_thumbnailpreview.Size = new System.Drawing.Size(394, 24); this.checkbox_thumbnailpreview.TabIndex = 5; this.checkbox_thumbnailpreview.UseVisualStyleBackColor = true; @@ -1199,7 +1200,7 @@ namespace Greenshot.Forms { this.checkbox_optimizeforrdp.LanguageKey = "expertsettings_optimizeforrdp"; this.checkbox_optimizeforrdp.Location = new System.Drawing.Point(10, 130); this.checkbox_optimizeforrdp.Name = "checkbox_optimizeforrdp"; - this.checkbox_optimizeforrdp.PropertyName = "OptimizeForRDP"; + this.checkbox_optimizeforrdp.PropertyName = nameof(coreConfiguration.OptimizeForRDP); this.checkbox_optimizeforrdp.Size = new System.Drawing.Size(394, 24); this.checkbox_optimizeforrdp.TabIndex = 4; this.checkbox_optimizeforrdp.UseVisualStyleBackColor = true; @@ -1209,7 +1210,7 @@ namespace Greenshot.Forms { this.checkbox_autoreducecolors.LanguageKey = "expertsettings_autoreducecolors"; this.checkbox_autoreducecolors.Location = new System.Drawing.Point(10, 111); this.checkbox_autoreducecolors.Name = "checkbox_autoreducecolors"; - this.checkbox_autoreducecolors.PropertyName = "OutputFileAutoReduceColors"; + this.checkbox_autoreducecolors.PropertyName = nameof(coreConfiguration.OutputFileAutoReduceColors); this.checkbox_autoreducecolors.Size = new System.Drawing.Size(408, 24); this.checkbox_autoreducecolors.TabIndex = 3; this.checkbox_autoreducecolors.UseVisualStyleBackColor = true; @@ -1257,7 +1258,7 @@ namespace Greenshot.Forms { // // SettingsForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(451, 431); this.Controls.Add(this.tabcontrol); diff --git a/src/Greenshot/Forms/SettingsForm.cs b/src/Greenshot/Forms/SettingsForm.cs index 7fecda8e2..12f2f07cb 100644 --- a/src/Greenshot/Forms/SettingsForm.cs +++ b/src/Greenshot/Forms/SettingsForm.cs @@ -28,6 +28,8 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; +using Dapplo.Windows.DesktopWindowsManager; +using Dapplo.Windows.Dpi; using Greenshot.Base; using Greenshot.Base.Controls; using Greenshot.Base.Core; @@ -35,9 +37,7 @@ using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Plugin; -using Greenshot.Base.UnmanagedHelpers; using Greenshot.Configuration; -using Greenshot.Destinations; using Greenshot.Helpers; using log4net; @@ -225,7 +225,7 @@ namespace Greenshot.Forms private void SetWindowCaptureMode(WindowCaptureMode selectedWindowCaptureMode) { WindowCaptureMode[] availableModes; - if (!DWM.IsDwmEnabled) + if (!DwmApi.IsDwmEnabled) { // Remove DWM from configuration, as DWM is disabled! if (coreConfiguration.WindowCaptureMode == WindowCaptureMode.Aero || coreConfiguration.WindowCaptureMode == WindowCaptureMode.AeroTransparent) @@ -320,7 +320,7 @@ namespace Greenshot.Forms combobox_language.SelectedValue = Language.CurrentLanguage; } - // Delaying the SelectedIndexChanged events untill all is initiated + // Delaying the SelectedIndexChanged events until all is initiated combobox_language.SelectedIndexChanged += Combobox_languageSelectedIndexChanged; UpdateDestinationDescriptions(); UpdateClipboardFormatDescriptions(); @@ -421,7 +421,7 @@ namespace Greenshot.Forms checkbox_picker.Checked = false; listview_destinations.Items.Clear(); - var scaledIconSize = DpiHelper.ScaleWithDpi(coreConfiguration.IconSize, DpiHelper.GetDpi(Handle)); + var scaledIconSize = DpiCalculator.ScaleWithDpi(coreConfiguration.IconSize, NativeDpiMethods.GetDpi(Handle)); listview_destinations.ListViewItemSorter = new ListviewWithDestinationComparer(); ImageList imageList = new ImageList { @@ -829,22 +829,19 @@ namespace Greenshot.Forms { public int Compare(object x, object y) { - if (!(x is ListViewItem)) + if (x is not ListViewItem listViewItemX) { return 0; } - if (!(y is ListViewItem)) + if (y is not ListViewItem listViewItemY) { return 0; } - ListViewItem l1 = (ListViewItem) x; - ListViewItem l2 = (ListViewItem) y; + IDestination firstDestination = listViewItemX.Tag as IDestination; - IDestination firstDestination = l1.Tag as IDestination; - - if (!(l2.Tag is IDestination secondDestination)) + if (listViewItemY.Tag is not IDestination secondDestination) { return 1; } diff --git a/src/Greenshot/Forms/ToolStripMenuSelectList.cs b/src/Greenshot/Forms/ToolStripMenuSelectList.cs index db6f8a184..2e2c9845c 100644 --- a/src/Greenshot/Forms/ToolStripMenuSelectList.cs +++ b/src/Greenshot/Forms/ToolStripMenuSelectList.cs @@ -23,8 +23,10 @@ using System; using System.Collections; using System.Drawing; using System.Windows.Forms; +using Dapplo.Windows.Dpi; using Greenshot.Base.Core; using Greenshot.Base.IniFile; +using Greenshot.Base.Interfaces; namespace Greenshot.Forms { @@ -35,6 +37,7 @@ namespace Greenshot.Forms { private static readonly CoreConfiguration CoreConfig = IniConfig.GetIniSection(); private readonly bool _multiCheckAllowed; + private readonly IProvideDeviceDpi _provideDeviceDpi; private bool _updateInProgress; private static Image _defaultImage; @@ -45,25 +48,29 @@ namespace Greenshot.Forms public object Identifier { get; private set; } - public ToolStripMenuSelectList(object identifier, bool allowMultiCheck) + public ToolStripMenuSelectList(object identifier, bool allowMultiCheck, IProvideDeviceDpi provideDeviceDpi) { Identifier = identifier; CheckOnClick = false; _multiCheckAllowed = allowMultiCheck; - if (_defaultImage == null || _defaultImage.Size != CoreConfig.ScaledIconSize) + _provideDeviceDpi = provideDeviceDpi; + UpdateImage(); + } + + + private void UpdateImage() + { + var newSize = DpiCalculator.ScaleWithDpi(CoreConfig.IconSize, _provideDeviceDpi.DeviceDpi); + if (_defaultImage == null || _defaultImage.Size != newSize) { _defaultImage?.Dispose(); - _defaultImage = ImageHelper.CreateEmpty(CoreConfig.ScaledIconSize.Width, CoreConfig.ScaledIconSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb, + _defaultImage = ImageHelper.CreateEmpty(newSize.Width, newSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb, Color.Transparent, 96f, 96f); } Image = _defaultImage; } - public ToolStripMenuSelectList() : this(null, false) - { - } - private void ItemCheckStateChanged(object sender, EventArgs e) { if (_updateInProgress) diff --git a/src/Greenshot/Greenshot.csproj b/src/Greenshot/Greenshot.csproj index 78fa3f6c6..f0d97afe9 100644 --- a/src/Greenshot/Greenshot.csproj +++ b/src/Greenshot/Greenshot.csproj @@ -9,6 +9,10 @@ false false + + none + false + @@ -17,7 +21,8 @@ - + + @@ -75,6 +80,7 @@ + diff --git a/src/Greenshot/Helpers/CaptureHelper.cs b/src/Greenshot/Helpers/CaptureHelper.cs index 662f3439a..e51b51ebe 100644 --- a/src/Greenshot/Helpers/CaptureHelper.cs +++ b/src/Greenshot/Helpers/CaptureHelper.cs @@ -28,12 +28,16 @@ using System.IO; using System.Text; using System.Threading; using System.Windows.Forms; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.DesktopWindowsManager; +using Dapplo.Windows.Kernel32; +using Dapplo.Windows.User32; using Greenshot.Base; using Greenshot.Base.Core; using Greenshot.Base.Core.Enums; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; -using Greenshot.Base.UnmanagedHelpers; using Greenshot.Configuration; using Greenshot.Editor.Destinations; using Greenshot.Editor.Drawing; @@ -52,7 +56,7 @@ namespace Greenshot.Helpers private List _windows = new(); private WindowDetails _selectedCaptureWindow; - private Rectangle _captureRect = Rectangle.Empty; + private NativeRect _captureRect = NativeRect.Empty; private readonly bool _captureMouseCursor; private ICapture _capture; private CaptureMode _captureMode; @@ -89,7 +93,7 @@ namespace Greenshot.Helpers // Empty working set after capturing if (CoreConfig.MinimizeWorkingSetSize) { - PsAPI.EmptyWorkingSet(); + PsApi.EmptyWorkingSet(); } } @@ -116,7 +120,7 @@ namespace Greenshot.Helpers captureHelper.MakeCapture(); } - public static void CaptureRegion(bool captureMouse, Rectangle region) + public static void CaptureRegion(bool captureMouse, NativeRect region) { using CaptureHelper captureHelper = new CaptureHelper(CaptureMode.Region, captureMouse); captureHelper.MakeCapture(region); @@ -243,8 +247,8 @@ namespace Greenshot.Helpers /// /// Make Capture for region /// - /// Rectangle - private void MakeCapture(Rectangle region) + /// NativeRect + private void MakeCapture(NativeRect region) { _captureRect = region; MakeCapture(); @@ -276,7 +280,7 @@ namespace Greenshot.Helpers { case CaptureMode.Region: // Check if a region is pre-supplied! - if (Rectangle.Empty.Equals(_captureRect)) + if (_captureRect.IsEmpty) { retrieveWindowDetailsThread = PrepareForCaptureWithFeedback(); } @@ -351,7 +355,7 @@ namespace Greenshot.Helpers switch (_screenCaptureMode) { case ScreenCaptureMode.Auto: - Point mouseLocation = User32.GetCursorLocation(); + NativePoint mouseLocation = User32Api.GetCursorLocation(); foreach (Screen screen in Screen.AllScreens) { if (screen.Bounds.Contains(mouseLocation)) @@ -359,8 +363,7 @@ namespace Greenshot.Helpers _capture = WindowCapture.CaptureRectangle(_capture, screen.Bounds); captureTaken = true; // As the screen shot might be on a different monitor we need to correct the mouse location - var correctedCursorLocation = _capture.CursorLocation; - correctedCursorLocation.Offset(-screen.Bounds.Location.X, -screen.Bounds.Location.Y); + var correctedCursorLocation = _capture.CursorLocation.Offset(-screen.Bounds.Location.X, -screen.Bounds.Location.Y); _capture.CursorLocation = correctedCursorLocation; break; } @@ -389,6 +392,7 @@ namespace Greenshot.Helpers HandleCapture(); break; case CaptureMode.Clipboard: + // TODO: Fix getting image vs. drawablecontainer Image clipboardImage = ClipboardHelper.GetImage(); if (clipboardImage != null) { @@ -430,12 +434,13 @@ namespace Greenshot.Helpers if (!string.IsNullOrEmpty(filename)) { + // TODO: Fix that the Greenshot format needs a separate code path try { if (filename.ToLower().EndsWith("." + OutputFormat.greenshot)) { ISurface surface = new Surface(); - surface = ImageOutput.LoadGreenshotSurface(filename, surface); + surface = ImageIO.LoadGreenshotSurface(filename, surface); surface.CaptureDetails = _capture.CaptureDetails; DestinationHelper.GetDestination(EditorDestination.DESIGNATION).ExportCapture(true, surface, _capture.CaptureDetails); break; @@ -447,9 +452,10 @@ namespace Greenshot.Helpers MessageBox.Show(Language.GetFormattedString(LangKey.error_openfile, filename)); } + // TODO: Remove Image loading for here try { - fileImage = ImageHelper.LoadImage(filename); + fileImage = ImageIO.LoadImage(filename); } catch (Exception e) { @@ -501,14 +507,12 @@ namespace Greenshot.Helpers // Set capture title, fixing bug #3569703 foreach (WindowDetails window in WindowDetails.GetVisibleWindows()) { - Point estimatedLocation = new Point(CoreConfig.LastCapturedRegion.X + CoreConfig.LastCapturedRegion.Width / 2, + NativePoint estimatedLocation = new NativePoint(CoreConfig.LastCapturedRegion.X + CoreConfig.LastCapturedRegion.Width / 2, CoreConfig.LastCapturedRegion.Y + CoreConfig.LastCapturedRegion.Height / 2); - if (window.Contains(estimatedLocation)) - { - _selectedCaptureWindow = window; - _capture.CaptureDetails.Title = _selectedCaptureWindow.Text; - break; - } + if (!window.Contains(estimatedLocation)) continue; + _selectedCaptureWindow = window; + _capture.CaptureDetails.Title = _selectedCaptureWindow.Text; + break; } // Move cursor, fixing bug #3569703 @@ -523,7 +527,7 @@ namespace Greenshot.Helpers break; case CaptureMode.Region: // Check if a region is pre-supplied! - if (Rectangle.Empty.Equals(_captureRect)) + if (_captureRect.IsEmpty) { _capture = WindowCapture.CaptureScreen(_capture); _capture.CaptureDetails.AddMetaData("source", "screen"); @@ -560,14 +564,6 @@ namespace Greenshot.Helpers { _windows = new List(); - // If the App Launcher is visible, no other windows are active - WindowDetails appLauncherWindow = WindowDetails.GetAppLauncher(); - if (appLauncherWindow != null && appLauncherWindow.Visible) - { - _windows.Add(appLauncherWindow); - return null; - } - Thread getWindowDetailsThread = new Thread(RetrieveWindowDetails) { Name = "Retrieve window details", @@ -682,7 +678,7 @@ namespace Greenshot.Helpers if (_capture.CaptureDetails.CaptureMode == CaptureMode.Text) { - var selectionRectangle = new Rectangle(Point.Empty, _capture.Image.Size); + var selectionRectangle = new NativeRect(NativePoint.Empty, _capture.Image.Size); var ocrInfo = _capture.CaptureDetails.OcrInformation; if (ocrInfo != null) { @@ -709,7 +705,10 @@ namespace Greenshot.Helpers textResult.AppendLine(); } - Clipboard.SetText(textResult.ToString()); + if (textResult.Length > 0) + { + Clipboard.SetText(textResult.ToString()); + } } // Disable capturing @@ -870,7 +869,7 @@ namespace Greenshot.Helpers /// WindowDetails with the target Window OR a replacement public static WindowDetails SelectCaptureWindow(WindowDetails windowToCapture) { - Rectangle windowRectangle = windowToCapture.WindowRectangle; + NativeRect windowRectangle = windowToCapture.WindowRectangle; if (windowRectangle.Width == 0 || windowRectangle.Height == 0) { Log.WarnFormat("Window {0} has nothing to capture, using workaround to find other window of same process.", windowToCapture.Text); @@ -936,10 +935,10 @@ namespace Greenshot.Helpers captureForWindow = new Capture(); } - Rectangle windowRectangle = windowToCapture.WindowRectangle; + NativeRect windowRectangle = windowToCapture.WindowRectangle; // When Vista & DWM (Aero) enabled - bool dwmEnabled = DWM.IsDwmEnabled; + bool dwmEnabled = DwmApi.IsDwmEnabled; // get process name to be able to exclude certain processes from certain capture modes using (Process process = windowToCapture.Process) { @@ -969,32 +968,40 @@ namespace Greenshot.Helpers // Take default screen windowCaptureMode = WindowCaptureMode.Screen; - // Change to GDI, if allowed - if (!windowToCapture.IsMetroApp && WindowCapture.IsGdiAllowed(process)) + // In https://github.com/greenshot/greenshot/issues/373 it was shown that PrintWindow (GDI) works great with Windows 11 + if (WindowsVersion.IsWindows11OrLater) { - if (!dwmEnabled && IsWpf(process)) - { - // do not use GDI, as DWM is not enabled and the application uses PresentationFramework.dll -> isWPF - Log.InfoFormat("Not using GDI for windows of process {0}, as the process uses WPF", process.ProcessName); - } - else - { - windowCaptureMode = WindowCaptureMode.GDI; - } + windowCaptureMode = WindowCaptureMode.GDI; } - - // Change to DWM, if enabled and allowed - if (dwmEnabled) + else { - if (windowToCapture.IsMetroApp || WindowCapture.IsDwmAllowed(process)) + // Change to GDI, if allowed + if (WindowCapture.IsGdiAllowed(process)) { - windowCaptureMode = WindowCaptureMode.Aero; + if (!dwmEnabled && IsWpf(process)) + { + // do not use GDI, as DWM is not enabled and the application uses PresentationFramework.dll -> isWPF + Log.InfoFormat("Not using GDI for windows of process {0}, as the process uses WPF", process.ProcessName); + } + else + { + windowCaptureMode = WindowCaptureMode.GDI; + } + } + + // Change to DWM, if enabled and allowed + if (dwmEnabled) + { + if (WindowCapture.IsDwmAllowed(process)) + { + windowCaptureMode = WindowCaptureMode.Aero; + } } } } else if (windowCaptureMode == WindowCaptureMode.Aero || windowCaptureMode == WindowCaptureMode.AeroTransparent) { - if (!dwmEnabled || (!windowToCapture.IsMetroApp && !WindowCapture.IsDwmAllowed(process))) + if (!dwmEnabled || !WindowCapture.IsDwmAllowed(process)) { // Take default screen windowCaptureMode = WindowCaptureMode.Screen; @@ -1013,7 +1020,7 @@ namespace Greenshot.Helpers Log.InfoFormat("Capturing window with mode {0}", windowCaptureMode); bool captureTaken = false; - windowRectangle.Intersect(captureForWindow.ScreenBounds); + windowRectangle = windowRectangle.Intersect(captureForWindow.ScreenBounds); // Try to capture while (!captureTaken) { @@ -1034,7 +1041,7 @@ namespace Greenshot.Helpers } tmpCapture = windowToCapture.CaptureGdiWindow(captureForWindow); - if (tmpCapture != null) + if (tmpCapture != null && !WindowsVersion.IsWindows11OrLater) { // check if GDI capture any good, by comparing it with the screen content int blackCountGdi = ImageHelper.CountColor(tmpCapture.Image, Color.Black, false); @@ -1100,7 +1107,7 @@ namespace Greenshot.Helpers break; case WindowCaptureMode.Aero: case WindowCaptureMode.AeroTransparent: - if (windowToCapture.IsMetroApp || WindowCapture.IsDwmAllowed(process)) + if (WindowCapture.IsDwmAllowed(process)) { tmpCapture = windowToCapture.CaptureDwmWindow(captureForWindow, windowCaptureMode, isAutoMode); } @@ -1205,8 +1212,7 @@ namespace Greenshot.Helpers // save for re-capturing later and show recapture context menu option // Important here is that the location needs to be offsetted back to screen coordinates! - Rectangle tmpRectangle = _captureRect; - tmpRectangle.Offset(_capture.ScreenBounds.Location.X, _capture.ScreenBounds.Location.Y); + NativeRect tmpRectangle = _captureRect.Offset(_capture.ScreenBounds.Location.X, _capture.ScreenBounds.Location.Y); CoreConfig.LastCapturedRegion = tmpRectangle; } diff --git a/src/Greenshot/Helpers/IECaptureHelper.cs b/src/Greenshot/Helpers/IECaptureHelper.cs index 3bb5e4eee..0da3d35dc 100644 --- a/src/Greenshot/Helpers/IECaptureHelper.cs +++ b/src/Greenshot/Helpers/IECaptureHelper.cs @@ -25,14 +25,17 @@ using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.InteropServices; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; +using Dapplo.Windows.Messages; +using Dapplo.Windows.User32; +using Dapplo.Windows.User32.Enums; using Greenshot.Base.Controls; using Greenshot.Base.Core; using Greenshot.Base.IEInterop; using Greenshot.Base.IniFile; using Greenshot.Base.Interfaces; using Greenshot.Base.Interop; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; using Greenshot.Configuration; using Greenshot.Helpers.IEInterop; using log4net; @@ -205,7 +208,7 @@ namespace Greenshot.Helpers return null; } - uint windowMessage = User32.RegisterWindowMessage("WM_HTML_GETOBJECT"); + uint windowMessage = WindowsMessage.RegisterWindowsMessage("WM_HTML_GETOBJECT"); if (windowMessage == 0) { Log.WarnFormat("Couldn't register WM_HTML_GETOBJECT"); @@ -213,7 +216,7 @@ namespace Greenshot.Helpers } Log.DebugFormat("Trying WM_HTML_GETOBJECT on {0}", ieServer.ClassName); - User32.SendMessageTimeout(ieServer.Handle, windowMessage, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_NORMAL, 5000, out var response); + User32Api.SendMessageTimeout(ieServer.Handle, windowMessage, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.Normal, 5000, out UIntPtr response); IHTMLDocument2 document2; if (response != UIntPtr.Zero) { @@ -719,14 +722,14 @@ namespace Greenshot.Helpers int horizontalPage = 0; // The location of the browser, used as the destination into the bitmap target - Point targetOffset = new Point(); + NativePoint targetOffset = NativePoint.Empty; // Loop of the pages and make a copy of the visible viewport while (horizontalPage * viewportWidth < pageWidth) { // Scroll to location documentContainer.ScrollLeft = viewportWidth * horizontalPage; - targetOffset.X = documentContainer.ScrollLeft; + targetOffset = targetOffset.ChangeX(documentContainer.ScrollLeft); // Variable used for looping vertically int verticalPage = 0; @@ -735,11 +738,11 @@ namespace Greenshot.Helpers // Scroll to location documentContainer.ScrollTop = viewportHeight * verticalPage; //Shoot visible window - targetOffset.Y = documentContainer.ScrollTop; + targetOffset = targetOffset.ChangeY(documentContainer.ScrollTop); // Draw the captured fragment to the target, but "crop" the scrollbars etc while capturing - Size viewPortSize = new Size(viewportWidth, viewportHeight); - Rectangle clientRectangle = new Rectangle(documentContainer.SourceLocation, viewPortSize); + NativeSize viewPortSize = new NativeSize(viewportWidth, viewportHeight); + NativeRect clientRectangle = new NativeRect(documentContainer.SourceLocation, viewPortSize); Image fragment = contentWindowDetails.PrintWindow(); if (fragment != null) { @@ -747,7 +750,7 @@ namespace Greenshot.Helpers try { // cut all junk, due to IE "border" we need to remove some parts - Rectangle viewportRect = documentContainer.ViewportRectangle; + NativeRect viewportRect = documentContainer.ViewportRectangle; if (!viewportRect.IsEmpty) { Log.DebugFormat("Cropping to viewport: {0}", viewportRect); @@ -758,9 +761,9 @@ namespace Greenshot.Helpers // Crop to clientRectangle if (ImageHelper.Crop(ref fragment, ref clientRectangle)) { - Point targetLocation = new Point(documentContainer.DestinationLocation.X, documentContainer.DestinationLocation.Y); + NativePoint targetLocation = new NativePoint(documentContainer.DestinationLocation.X, documentContainer.DestinationLocation.Y); Log.DebugFormat("Fragment targetLocation is {0}", targetLocation); - targetLocation.Offset(targetOffset); + targetLocation = targetLocation.Offset(targetOffset); Log.DebugFormat("After offsetting the fragment targetLocation is {0}", targetLocation); Log.DebugFormat("Drawing fragment of size {0} to {1}", fragment.Size, targetLocation); graphicsTarget.DrawImage(fragment, targetLocation); diff --git a/src/Greenshot/Helpers/IEInterop/IEContainer.cs b/src/Greenshot/Helpers/IEInterop/IEContainer.cs index 77e20d695..178dc5643 100644 --- a/src/Greenshot/Helpers/IEInterop/IEContainer.cs +++ b/src/Greenshot/Helpers/IEInterop/IEContainer.cs @@ -24,6 +24,8 @@ using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.Runtime.InteropServices; +using Dapplo.Windows.Common.Extensions; +using Dapplo.Windows.Common.Structs; using Greenshot.Base.Core; using Greenshot.Base.IEInterop; using log4net; @@ -38,12 +40,12 @@ namespace Greenshot.Helpers.IEInterop private static readonly Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); private static readonly Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"); private static int _counter; + private readonly NativePoint _startLocation = NativePoint.Empty; private IHTMLDocument2 _document2; private IHTMLDocument3 _document3; - private Point _sourceLocation; - private Point _destinationLocation; - private Point _startLocation = Point.Empty; - private Rectangle _viewportRectangle = Rectangle.Empty; + private NativePoint _sourceLocation; + private NativePoint _destinationLocation; + private NativeRect _viewportRectangle = NativeRect.Empty; private bool _isDtd; private DocumentContainer _parent; private WindowDetails _contentWindow; @@ -88,15 +90,15 @@ namespace Greenshot.Helpers.IEInterop // Calculate startLocation for the frames IHTMLWindow2 window2 = document2.parentWindow; IHTMLWindow3 window3 = (IHTMLWindow3) window2; - Point contentWindowLocation = contentWindow.WindowRectangle.Location; + NativePoint contentWindowLocation = contentWindow.WindowRectangle.Location; int x = window3.screenLeft - contentWindowLocation.X; int y = window3.screenTop - contentWindowLocation.Y; // Release IHTMLWindow 2+3 com objects - releaseCom(window2); - releaseCom(window3); + ReleaseCom(window2); + ReleaseCom(window3); - _startLocation = new Point(x, y); + _startLocation = new NativePoint(x, y); Init(document2, contentWindow); } @@ -110,7 +112,7 @@ namespace Greenshot.Helpers.IEInterop /// Helper method to release com objects /// /// - private void releaseCom(object comObject) + private void ReleaseCom(object comObject) { if (comObject != null) { @@ -148,7 +150,7 @@ namespace Greenshot.Helpers.IEInterop // Do not release IHTMLDocument5 com object, as this also gives problems with the document2! //Marshal.ReleaseComObject(document5); - Rectangle clientRectangle = contentWindow.WindowRectangle; + NativeRect clientRectangle = contentWindow.WindowRectangle; try { IHTMLWindow2 window2 = document2.parentWindow; @@ -180,20 +182,20 @@ namespace Greenshot.Helpers.IEInterop int diffY = clientRectangle.Height - ClientHeight; // If there is a border around the inner window, the diff == 4 // If there is a border AND a scrollbar the diff == 20 - if ((diffX == 4 || diffX >= 20) && (diffY == 4 || diffY >= 20)) + if (diffX is 4 or >= 20 && diffY is 4 or >= 20) { - Point viewportOffset = new Point(2, 2); - Size viewportSize = new Size(ClientWidth, ClientHeight); - _viewportRectangle = new Rectangle(viewportOffset, viewportSize); + var viewportOffset = new NativePoint(2, 2); + var viewportSize = new NativeSize(ClientWidth, ClientHeight); + _viewportRectangle = new NativeRect(viewportOffset, viewportSize); LOG.DebugFormat("viewportRect {0}", _viewportRectangle); } } LOG.DebugFormat("Zoomlevel {0}, {1}", _zoomLevelX, _zoomLevelY); // Release com objects - releaseCom(window2); - releaseCom(screen); - releaseCom(screen2); + ReleaseCom(window2); + ReleaseCom(screen); + ReleaseCom(screen2); } catch (Exception e) { @@ -223,8 +225,8 @@ namespace Greenshot.Helpers.IEInterop LOG.Warn("Problem while trying to get document url!", e); } - _sourceLocation = new Point(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); - _destinationLocation = new Point(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); + _sourceLocation = new NativePoint(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); + _destinationLocation = new NativePoint(ScaleX(_startLocation.X), ScaleY(_startLocation.Y)); if (_parent != null) { @@ -252,7 +254,7 @@ namespace Greenshot.Helpers.IEInterop } // Clean up frameWindow - releaseCom(frameWindow); + ReleaseCom(frameWindow); } catch (Exception e) { @@ -261,7 +263,7 @@ namespace Greenshot.Helpers.IEInterop } // Clean up collection - releaseCom(frameCollection); + ReleaseCom(frameCollection); } catch (Exception ex) { @@ -277,7 +279,7 @@ namespace Greenshot.Helpers.IEInterop { CorrectFrameLocations(frameElement); // Clean up frameElement - releaseCom(frameElement); + ReleaseCom(frameElement); } catch (Exception e) { @@ -292,7 +294,7 @@ namespace Greenshot.Helpers.IEInterop } /// - /// Corrent the frame locations with the information + /// Correct the frame locations with the information /// /// private void CorrectFrameLocations(IHTMLElement frameElement) @@ -309,22 +311,22 @@ namespace Greenshot.Helpers.IEInterop // Release element, but prevent the frameElement to be released if (oldElement != null) { - releaseCom(oldElement); + ReleaseCom(oldElement); } oldElement = element; } while (element != null); - Point elementLocation = new Point((int) x, (int) y); + var elementLocation = new NativePoint((int) x, (int) y); IHTMLElement2 element2 = (IHTMLElement2) frameElement; IHTMLRect rec = element2.getBoundingClientRect(); - Point elementBoundingLocation = new Point(rec.left, rec.top); + var elementBoundingLocation = new NativePoint(rec.left, rec.top); // Release IHTMLRect - releaseCom(rec); + ReleaseCom(rec); LOG.DebugFormat("Looking for iframe to correct at {0}", elementBoundingLocation); foreach (DocumentContainer foundFrame in _frames) { - Point frameLocation = foundFrame.SourceLocation; + NativePoint frameLocation = foundFrame.SourceLocation; if (frameLocation.Equals(elementBoundingLocation)) { // Match found, correcting location @@ -425,7 +427,7 @@ namespace Greenshot.Helpers.IEInterop } } - public Rectangle ViewportRectangle => _viewportRectangle; + public NativeRect ViewportRectangle => _viewportRectangle; public WindowDetails ContentWindow => _contentWindow; @@ -473,7 +475,7 @@ namespace Greenshot.Helpers.IEInterop var element = !_isDtd ? _document2.body : _document3.documentElement; element.setAttribute(attribute, value, 1); // Release IHTMLElement com object - releaseCom(element); + ReleaseCom(element); } /// @@ -486,7 +488,7 @@ namespace Greenshot.Helpers.IEInterop var element = !_isDtd ? _document2.body : _document3.documentElement; var retVal = element.getAttribute(attribute, 1); // Release IHTMLElement com object - releaseCom(element); + ReleaseCom(element); return retVal; } @@ -515,15 +517,15 @@ namespace Greenshot.Helpers.IEInterop public int ScrollHeight => ScaleY(GetAttributeAsInt("scrollHeight")); - public Point SourceLocation + public NativePoint SourceLocation { get { return _sourceLocation; } set { _sourceLocation = value; } } - public Size SourceSize => new Size(ClientWidth, ClientHeight); + public NativeSize SourceSize => new NativeSize(ClientWidth, ClientHeight); - public Rectangle SourceRectangle => new Rectangle(SourceLocation, SourceSize); + public NativeRect SourceRectangle => new NativeRect(SourceLocation, SourceSize); public int SourceLeft => _sourceLocation.X; @@ -533,26 +535,26 @@ namespace Greenshot.Helpers.IEInterop public int SourceBottom => _sourceLocation.Y + ClientHeight; - public Point DestinationLocation + public NativePoint DestinationLocation { get { return _destinationLocation; } set { _destinationLocation = value; } } - public Size DestinationSize => new Size(ScrollWidth, ScrollHeight); + public NativeSize DestinationSize => new NativeSize(ScrollWidth, ScrollHeight); - public Rectangle DestinationRectangle => new Rectangle(DestinationLocation, DestinationSize); + public NativeRect DestinationRectangle => new NativeRect(DestinationLocation, DestinationSize); public int DestinationLeft { get { return _destinationLocation.X; } - set { _destinationLocation.X = value; } + set { _destinationLocation = _destinationLocation.ChangeX(value); } } public int DestinationTop { get { return _destinationLocation.Y; } - set { _destinationLocation.Y = value; } + set { _destinationLocation = _destinationLocation.ChangeY(value); } } public int DestinationRight => _destinationLocation.X + ScrollWidth; diff --git a/src/Greenshot/Helpers/MailHelper.cs b/src/Greenshot/Helpers/MailHelper.cs index f3975a205..39aa3c150 100644 --- a/src/Greenshot/Helpers/MailHelper.cs +++ b/src/Greenshot/Helpers/MailHelper.cs @@ -82,7 +82,7 @@ namespace Greenshot.Helpers /// ICaptureDetails public static void SendImage(ISurface surface, ICaptureDetails captureDetails) { - string tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings()); + string tmpFile = ImageIO.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings()); if (tmpFile == null) return; diff --git a/src/Greenshot/Helpers/PluginHelper.cs b/src/Greenshot/Helpers/PluginHelper.cs index 3ed3d97c3..e5724a4f5 100644 --- a/src/Greenshot/Helpers/PluginHelper.cs +++ b/src/Greenshot/Helpers/PluginHelper.cs @@ -219,17 +219,14 @@ namespace Greenshot.Helpers { var assembly = Assembly.LoadFrom(pluginFile); - var assemblyName = assembly.GetName().Name; - - var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin"; - var pluginEntryType = assembly.GetType(pluginEntryName, false, true); - - if (CoreConfig.ExcludePlugins != null && CoreConfig.ExcludePlugins.Contains(pluginEntryName)) + if (IsPluginExcludedByConfig(assembly, pluginFile) ) { - Log.WarnFormat("Exclude list: {0}", string.Join(",", CoreConfig.ExcludePlugins)); - Log.WarnFormat("Skipping the excluded plugin {0} with version {1} from {2}", pluginEntryName, assembly.GetName().Version, pluginFile); continue; } + + var assemblyName = assembly.GetName().Name; + var pluginEntryName = $"{assemblyName}.{assemblyName.Replace("Greenshot.Plugin.", string.Empty)}Plugin"; + var pluginEntryType = assembly.GetType(pluginEntryName, false, true); var plugin = (IGreenshotPlugin) Activator.CreateInstance(pluginEntryType); if (plugin != null) @@ -255,5 +252,54 @@ namespace Greenshot.Helpers } } } + /// + /// This method checks the plugin against the configured include and exclude plugin + /// lists. If a plugin is excluded, a warning is logged with details about the exclusion. + /// + private bool IsPluginExcludedByConfig(Assembly assembly, string pluginFile) + { + // Get plugin identifier from assembly attributes + string pluginConfigIdentifier = GetPluginIdentifier(assembly, pluginFile); + + if (CoreConfig.IncludePlugins is { } includePlugins + && includePlugins.Count(p => !string.IsNullOrWhiteSpace(p)) > 0 // ignore empty entries i.e. a whitespace + && !includePlugins.Contains(pluginConfigIdentifier)) + { + Log.WarnFormat("Include plugin list: {0}", string.Join(",", includePlugins)); + Log.WarnFormat("Skipping the not included plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile); + return true; + } + + if (CoreConfig.ExcludePlugins is { } excludePlugins + && excludePlugins.Contains(pluginConfigIdentifier)) + { + Log.WarnFormat("Exclude plugin list: {0}", string.Join(",", excludePlugins)); + Log.WarnFormat("Skipping the excluded plugin '{0}' with version {1} from {2}", pluginConfigIdentifier, assembly.GetName().Version, pluginFile); + return true; + } + + return false; + } + + /// + /// Retrieves the plugin identifier for the specified assembly. + /// + private string GetPluginIdentifier(Assembly assembly, string pluginFile) + { + // Try to find PluginIdentifierAttribute + var attribute = assembly + .GetCustomAttributes() + .FirstOrDefault(); + + if (!string.IsNullOrEmpty(attribute?.Identifier)) + { + return attribute.Identifier; + } + + // If no attribute found, fall back to the sub namespace + var pluginSubNamespace = assembly.GetName().Name.Replace("Greenshot.Plugin.", string.Empty); + Log.WarnFormat("No '{0}' found in '{1}'. Use plugin namespace '{2}' as fallback.", nameof(AssemblyPluginIdentifierAttribute), pluginFile, pluginSubNamespace); + return pluginSubNamespace; + } } } \ No newline at end of file diff --git a/src/Greenshot/Helpers/PrintHelper.cs b/src/Greenshot/Helpers/PrintHelper.cs index 9e6a43a7f..36bf8257b 100644 --- a/src/Greenshot/Helpers/PrintHelper.cs +++ b/src/Greenshot/Helpers/PrintHelper.cs @@ -187,7 +187,7 @@ namespace Greenshot.Helpers ApplyEffects(printOutputSettings); - bool disposeImage = ImageOutput.CreateImageFromSurface(_surface, printOutputSettings, out var image); + bool disposeImage = ImageIO.CreateImageFromSurface(_surface, printOutputSettings, out var image); try { ContentAlignment alignment = CoreConfig.OutputPrintCenter ? ContentAlignment.MiddleCenter : ContentAlignment.TopLeft; diff --git a/src/Greenshot/Helpers/SoundHelper.cs b/src/Greenshot/Helpers/SoundHelper.cs index 69e42850f..796aec077 100644 --- a/src/Greenshot/Helpers/SoundHelper.cs +++ b/src/Greenshot/Helpers/SoundHelper.cs @@ -24,10 +24,10 @@ using System.Reflection; using System.Resources; using System.Runtime.InteropServices; using System.IO; +using Dapplo.Windows.Multimedia; +using Dapplo.Windows.Multimedia.Enums; using Greenshot.Base.Core; using Greenshot.Base.IniFile; -using Greenshot.Base.UnmanagedHelpers; -using Greenshot.Base.UnmanagedHelpers.Enums; using log4net; namespace Greenshot.Helpers @@ -82,10 +82,10 @@ namespace Greenshot.Helpers if (_soundBuffer != null) { //Thread playSoundThread = new Thread(delegate() { - SoundFlags flags = SoundFlags.SND_ASYNC | SoundFlags.SND_MEMORY | SoundFlags.SND_NOWAIT | SoundFlags.SND_NOSTOP; + var flags = SoundSettings.Async | SoundSettings.Memory| SoundSettings.NoWait| SoundSettings.NoStop; try { - if (_gcHandle != null) WinMM.PlaySound(_gcHandle.Value.AddrOfPinnedObject(), (UIntPtr) 0, (uint) flags); + if (_gcHandle != null) WinMm.Play(_gcHandle.Value.AddrOfPinnedObject(), flags); } catch (Exception e) { @@ -105,14 +105,14 @@ namespace Greenshot.Helpers { if (_gcHandle != null) { - WinMM.PlaySound(null, (UIntPtr) 0, 0); + WinMm.StopPlaying(); _gcHandle.Value.Free(); _gcHandle = null; } } catch (Exception e) { - Log.Error("Error in deinitialize.", e); + Log.Error("Error in de-initialize.", e); } } } diff --git a/src/Greenshot/Languages/language-ar-SY.xml b/src/Greenshot/Languages/language-ar-SY.xml index c5c6edc84..a7363a326 100644 --- a/src/Greenshot/Languages/language-ar-SY.xml +++ b/src/Greenshot/Languages/language-ar-SY.xml @@ -62,6 +62,7 @@ انسخ المسار الي الذاكرة نسخ قص (C) + قص اداة التحديد (ESC) قص احذف diff --git a/src/Greenshot/Languages/language-ca-CA.xml b/src/Greenshot/Languages/language-ca-CA.xml index 9f92f7446..323f7849f 100644 --- a/src/Greenshot/Languages/language-ca-CA.xml +++ b/src/Greenshot/Languages/language-ca-CA.xml @@ -92,6 +92,8 @@ Abans de crear un nou informe d'error, us agrairem que comproveu que l'error no Copia el camí al porta-retalls Copia Retalla(C) + Retalla + Autorretalla Eina de selecció (ESC) Retalla Esborra @@ -303,7 +305,7 @@ Malgrat això, encara es poden utilitzar totes les característiques de Greensho Afegeix un comptador (I) Afegeix una bafarada (S) - Canvia la mida + Canvia la mida (Z) Configuració del canvi de mida Manté la relació d'aspecte Amplada diff --git a/src/Greenshot/Languages/language-cs-CZ.xml b/src/Greenshot/Languages/language-cs-CZ.xml index 915fd3fe0..cc409c66f 100644 --- a/src/Greenshot/Languages/language-cs-CZ.xml +++ b/src/Greenshot/Languages/language-cs-CZ.xml @@ -93,6 +93,8 @@ Také bychom velmi ocenili, kdybyste zkontrolovali, zda tato chyba již není ev Kopírovat cestu do schránky Kopírovat Oříznout (C) + Oříznout + Automatické oříznutí Výběr objektů (ESC) Vystřihnout Odstranit @@ -306,7 +308,7 @@ Všechny funkce Greenshotu jsou stále dostupné přímo z místní nabídky bez Přidat počítadlo (I) Přidat textovou bublinu (S) - Změnit velikost + Změnit velikost (Z) Nastavení změny velikosti Zachovat poměr stran Šířka diff --git a/src/Greenshot/Languages/language-da-DK.xml b/src/Greenshot/Languages/language-da-DK.xml index 166774d34..b032e8aff 100644 --- a/src/Greenshot/Languages/language-da-DK.xml +++ b/src/Greenshot/Languages/language-da-DK.xml @@ -469,6 +469,9 @@ tidspunktet, fx 11_58_32 (plus filendelsen angivet i indstillingerne). Beskær (C) + + Beskær + Åbn billede fra udklipsholder diff --git a/src/Greenshot/Languages/language-de-DE.xml b/src/Greenshot/Languages/language-de-DE.xml index 062cdd6a5..b636da112 100644 --- a/src/Greenshot/Languages/language-de-DE.xml +++ b/src/Greenshot/Languages/language-de-DE.xml @@ -77,6 +77,7 @@ schnell zu finden. Vielen Dank :) Keine Anfangspunkt Automatisch zuschneiden + Automatisches Zuschneiden nicht möglich Hintergrundfarbe (0-9) Weichzeichner-Radius Fett @@ -92,6 +93,11 @@ schnell zu finden. Vielen Dank :) Pfad in Zwischenablage kopieren Kopieren Zuschneiden (C) + Zuschneiden - Modus + Zuschneiden + Vertikal ausschneiden + Horizontal ausschneiden + Automatisch zuschneiden Auswahlwerkzeug (Esc) Ausschneiden Gewähltes Element löschen @@ -306,7 +312,7 @@ Sie können aber auch alle Greenshot-Funktionen über das Kontextmenü des Green Zähler hinzufügen (I) Sprechblase hinzufügen (S) - Skalieren + Skalieren (Z) Einstellungen für Skalierung Seitenverhältnis beibehalten Breite diff --git a/src/Greenshot/Languages/language-de-x-franconia.xml b/src/Greenshot/Languages/language-de-x-franconia.xml index b989bcfe7..34da6f0b7 100644 --- a/src/Greenshot/Languages/language-de-x-franconia.xml +++ b/src/Greenshot/Languages/language-de-x-franconia.xml @@ -88,6 +88,8 @@ Dangschee, wassd scho :) Bfad in däi Zwischnblach nei Kobiern Zamschneidn (C) + Zamschneidn + Audomadisch zamschneidn Angriffln (ESC) Ausschneidn Wech mid dem Ding! diff --git a/src/Greenshot/Languages/language-el-GR.xml b/src/Greenshot/Languages/language-el-GR.xml index 14cb68bef..1feb74b51 100644 --- a/src/Greenshot/Languages/language-el-GR.xml +++ b/src/Greenshot/Languages/language-el-GR.xml @@ -93,6 +93,8 @@ Αντιγραφή της θέσης του αρχείου στο πρόχειρο Αντιγραφή Περικοπή (C) + Περικοπή + Αυτόματη Περικοπή Εργαλείο Επιλογής (ESC) Αποκοπή Διαγραφή diff --git a/src/Greenshot/Languages/language-en-US.xml b/src/Greenshot/Languages/language-en-US.xml index b575f549b..1403d3e9c 100644 --- a/src/Greenshot/Languages/language-en-US.xml +++ b/src/Greenshot/Languages/language-en-US.xml @@ -78,6 +78,7 @@ Also, we would highly appreciate if you checked whether a tracker item already e None Start point Auto crop + Auto crop not possible Fill color (0-9) Blur radius Bold @@ -93,6 +94,11 @@ Also, we would highly appreciate if you checked whether a tracker item already e Copy path to clipboard Copy Crop (C) + Crop mode + Crop + Crop out vertically + Crop out horizontally + Auto crop Selection Tool (ESC) Cut Delete @@ -306,7 +312,7 @@ All Greenshot features still work directly from the tray icon context menu witho Add counter (I) Add speechbubble (S) - Resize + Resize (Z) Resize settings Maintain aspect ratio Width diff --git a/src/Greenshot/Languages/language-es-ES.xml b/src/Greenshot/Languages/language-es-ES.xml index b84aee912..0badf64a4 100644 --- a/src/Greenshot/Languages/language-es-ES.xml +++ b/src/Greenshot/Languages/language-es-ES.xml @@ -80,6 +80,8 @@ Antes de crear un nuevo informe de error, te agradeceríamos que comprobaras que Copiar ruta al portapapeles Copiar Recortar(C) + Recortar + Autorrecortar Herramienta de selección (ESC) Cortar Borrar diff --git a/src/Greenshot/Languages/language-et-EE.xml b/src/Greenshot/Languages/language-et-EE.xml index b358977e8..7a4b0dcc3 100644 --- a/src/Greenshot/Languages/language-et-EE.xml +++ b/src/Greenshot/Languages/language-et-EE.xml @@ -92,6 +92,8 @@ Me oleksime väga tänulik, kui te enne kontrolliksite, ega sellest veast pole j Kopeerige asukoht lõikelauale Kopeeri Lõika (C) + Lõika + Automaatne lõikus Valiku tööriist (ESC) Lõika Kustuta diff --git a/src/Greenshot/Languages/language-fa-IR.xml b/src/Greenshot/Languages/language-fa-IR.xml index 20e1da09f..2ab2c8242 100644 --- a/src/Greenshot/Languages/language-fa-IR.xml +++ b/src/Greenshot/Languages/language-fa-IR.xml @@ -67,6 +67,7 @@ Could not save Greenshot's configuration file. Please check access permissions f رونویس چیدن (C دکمه) + چیدن انتخابگر (ESC دکمه) برش diff --git a/src/Greenshot/Languages/language-fi-FI.xml b/src/Greenshot/Languages/language-fi-FI.xml index f66cc5013..a2f211b03 100644 --- a/src/Greenshot/Languages/language-fi-FI.xml +++ b/src/Greenshot/Languages/language-fi-FI.xml @@ -62,6 +62,7 @@ Olisi myös hyvä jos voisit tarkistaa onko virhe jo raportoitu aikaisemmin (voi Kopioi tiedostopolku leikepöydälle Kopioi Rajaa (C) + Rajaa Valintatyökalu (ESC) Leikkaa Poista diff --git a/src/Greenshot/Languages/language-fr-FR.xml b/src/Greenshot/Languages/language-fr-FR.xml index 53f8e21f6..4ef502438 100644 --- a/src/Greenshot/Languages/language-fr-FR.xml +++ b/src/Greenshot/Languages/language-fr-FR.xml @@ -93,6 +93,8 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Copier Ajouter un compteur Recadrer (C) + Recadrer + Cadrage automatique Outil de sélection (ESC) Couper Supprimer @@ -142,7 +144,7 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Imprimer Rétablir {0} Réinitialiser la taille - Redimensionner + Redimensionner (Z) Maintenir le rapport L / H Hauteur Pourcentage diff --git a/src/Greenshot/Languages/language-fr-QC.xml b/src/Greenshot/Languages/language-fr-QC.xml index 17c0e5537..cf822fa16 100644 --- a/src/Greenshot/Languages/language-fr-QC.xml +++ b/src/Greenshot/Languages/language-fr-QC.xml @@ -78,6 +78,8 @@ De plus, nous apprécierions beaucoup que vous preniez la peine de vérifier si Copier le chemin vers le presse-papier Copier Rogner (C) + Rogner + Rognage automatique Outil de sélection (ESC) Couper Supprimer diff --git a/src/Greenshot/Languages/language-he-IL.xml b/src/Greenshot/Languages/language-he-IL.xml index 4df909d37..537f77067 100644 --- a/src/Greenshot/Languages/language-he-IL.xml +++ b/src/Greenshot/Languages/language-he-IL.xml @@ -63,6 +63,7 @@ Details about the GNU General Public License: העתק נתיב אל הלוח העתקה חתוך (C) + חתוך כלי בחירה (ESC) חיתוך מחיקה diff --git a/src/Greenshot/Languages/language-hu-HU.xml b/src/Greenshot/Languages/language-hu-HU.xml index 0d5a06df9..20035f3c5 100644 --- a/src/Greenshot/Languages/language-hu-HU.xml +++ b/src/Greenshot/Languages/language-hu-HU.xml @@ -63,6 +63,7 @@ Kérjük adjon összefoglaló leírást és csatoljon minden olyan információt Másolja a vágólapra Másolás Vágás eszköz (C) + Vágás eszköz Kiválasztó eszköz (ESC) Kivágás Törlés diff --git a/src/Greenshot/Languages/language-id-ID.xml b/src/Greenshot/Languages/language-id-ID.xml index e474cae59..fcb887082 100644 --- a/src/Greenshot/Languages/language-id-ID.xml +++ b/src/Greenshot/Languages/language-id-ID.xml @@ -93,6 +93,8 @@ Juga, kami sangat terbantu apabila anda mengecek laporan lain yang sama dengan k Kopi Buat penomor Potong (C) + Potong + Auto potong Alat seleksi (ESC) Gunting Hapus @@ -142,7 +144,7 @@ Juga, kami sangat terbantu apabila anda mengecek laporan lain yang sama dengan k Cetak Ulang {0} Reset ukuran - Ubah ukuran + Ubah ukuran (Z) Pertahankan aspek rasio Tinggi Persen diff --git a/src/Greenshot/Languages/language-it-IT.xml b/src/Greenshot/Languages/language-it-IT.xml index 53fa10837..89d68c988 100644 --- a/src/Greenshot/Languages/language-it-IT.xml +++ b/src/Greenshot/Languages/language-it-IT.xml @@ -6,7 +6,7 @@ Greenshot è disponibile nel repository GitHub Libreria icone del set icone Fugue di Yusuke Kamiyamane (Creative Commons Attribution 3.0 license) Copyright (C) 2007-2021 Thomas Braun, Jens Klingen, Robin Krom -Greenshot viene fornito SENZA ALCUNA GARANZIA. +Greenshot viene fornito SENZA ALCUNA GARANZIA. Questo software è gratuito", e potete ri-distribuirlo secondo certe condizioni. Dettagli della General Public License GNU: Info su Greenshot @@ -19,8 +19,7 @@ La buona notizia è che puoi aiutarci ad eliminarlo segnalandoci l'errore. Visita la pagina internet qui sotto, crea una nuova segnalazione errore e copia nella descrizione il contenuto preso dall'area di testo. Aggiungi un riepilogo significativo e includi qualsiasi informazione tu consideri possa esserci d'aiuto per risolvere il problema. -Inoltre apprezzeremo molto, se prima di inserire la segnalazione, controllassi se esiste già una segnalazione per questo tipo di errore (puoi usare la ricerca) -Grazie :) +Inoltre apprezzeremo molto, se prima di inserire la segnalazione, controllassi se esiste già una segnalazione per questo tipo di errore (puoi usare la ricerca). Grazie :) Errore Annulla Si è verificato un errore inaspettato durante la scrittura negli Appunti. @@ -82,7 +81,8 @@ Controlla i permessi di accesso per '{0}'. Punto finale Nessuna Punto iniziale - Ritaglia Automaticamente + Ritaglia automaticamente + Ritaglio automatico non possibile Colore di riempimento Raggio sfumatura Grassetto @@ -98,6 +98,10 @@ Controlla i permessi di accesso per '{0}'. Copia percorso negli appunti Copia Ritaglia (C) + Ritaglia + Ritaglia verticalmente + Ritaglia orizzontalmente + Ritaglia automaticamente Strumento di selezione (ESC) Taglia Elimina @@ -129,8 +133,8 @@ Controlla i permessi di accesso per '{0}'. Negativo Corsivo Carica oggetti da file - Fattore di ingrandimento - Adatta a dimensioni di cattura + Fattore ingrandimento + Adatta a dimensioni cattura Offusca (O) Sfuma Modalità offuscamento @@ -175,17 +179,17 @@ Verifica l'accesso in scrittura nel percorso di salvataggio. Il nome file o cartella generato non è valido. Correggi la maschera noem file e riprova. Utente esperto - Crea una immagine a 8bit se i colori sono meno di 256 e l'immagine ha > 8 bit + Crea immagine a 8bit se immagine ha meno di 256 colori Controlla disponibilità aggiornamenti versioni beta - Formati degli Appunti - Numero per var. ${NUM} nel modello del nome file + Formato Appunti + Numero var. ${NUM} modello nome file Sono consapevole di ciò che sto facendo! - Modello piè di pagina + Modello piè pagina Riduci uso della memoria perdendo però in prestazioni (sconsigliato). Esegui ottimizzazioni per uso con desktop remoto Riutilizza se possibile la gestione immagini Evita avviso di salvataggio in chiusura della gestione immagini - Visualizza anteprima finestra nel menù contestuale (Vista e Windows 7) + Visualizza anteprima finestra menù contestuale (Vista/Windows 7) Esportato in: {0} Si è verificato un errore durante l'esportazione in {0}: Guida in linea Greenshot @@ -215,7 +219,7 @@ Correggi la maschera noem file e riprova. Esegui Greenshot all'avvio del sistema Cattura Cattura puntatore mouse - Usa la modalità di cattura via finestra interattiva + Usa modalità cattura via finestra interattiva Intervallo controllo aggiornamento in giorni (0=nessun controllo) Imposta Ogni volta che una immagine viene salvata copia percorso file negli Appunti @@ -265,7 +269,7 @@ impostazioni) Stampante Opzioni di stampa Impostazioni qualità - Riduci i colori a un massimo di 256 + Riduci i colori ad un massimo di 256 Registra scorciatoie tastiera Visualizza torcia elettrica Visualizza notifiche @@ -294,8 +298,8 @@ In alternativa alle scorciatoie di tastiera, tutte le funzioni di Greenshot sono Usa colori personalizzati Mantieni trasparenza - Automaticamente - Usa i colori predefiniti + Automatica + Usa colori predefiniti Come visualizzata @@ -318,12 +322,12 @@ In alternativa alle scorciatoie di tastiera, tutte le funzioni di Greenshot sono Aggiungi conteggio Aggiungi nuvoletta - Ridimensiona + Ridimensiona (Z) Impostazioni ridimensionamento Mantieni rapporto dimensioni Larghezza Altezza - Dimensione icona + Dimensione icona (pixel) diff --git a/src/Greenshot/Languages/language-ja-JP.xml b/src/Greenshot/Languages/language-ja-JP.xml index c894b9573..36f5231f2 100644 --- a/src/Greenshot/Languages/language-ja-JP.xml +++ b/src/Greenshot/Languages/language-ja-JP.xml @@ -92,6 +92,8 @@ Greenshot には一切の保障がありません。GNU General Public License コピー カウンターを挿入する (I) 切り抜き (C) + 切り抜き + 自動切り抜き 選択ツール (ESC) 切り取り 削除 @@ -141,7 +143,7 @@ Greenshot には一切の保障がありません。GNU General Public License 印刷 やり直し{0} サイズをリセット - リサイズ + リサイズ (Z) 縦横比を維持する 高さ パーセント diff --git a/src/Greenshot/Languages/language-kab-DZ.xml b/src/Greenshot/Languages/language-kab-DZ.xml index 31930d2db..8a690952c 100644 --- a/src/Greenshot/Languages/language-kab-DZ.xml +++ b/src/Greenshot/Languages/language-kab-DZ.xml @@ -93,6 +93,8 @@ Rnu ɣur-s, nḥemmel aṭas ma yella tesneqdeḍ aneqqis igebren ugur-agi. (Tze Nɣel Rnu Amesmiḍan Seggem (C) + Seggem + Aseggem awurman Afecku n ufran (ESC) Gzem Kkes @@ -142,7 +144,7 @@ Rnu ɣur-s, nḥemmel aṭas ma yella tesneqdeḍ aneqqis igebren ugur-agi. (Tze Siggez Err-d {0} Wennez teɣzi - Snifel tahri/teɣzi + Snifel tahri/teɣzi (Z) Eǧǧ afmiḍi Teɣ / Teh Awrir Afmiḍi diff --git a/src/Greenshot/Languages/language-ko-KR.xml b/src/Greenshot/Languages/language-ko-KR.xml index a332cea33..144188ad8 100644 --- a/src/Greenshot/Languages/language-ko-KR.xml +++ b/src/Greenshot/Languages/language-ko-KR.xml @@ -92,6 +92,8 @@ Also, we would highly appreciate if you checked whether a tracker item already e 경로를 클립보드로 복사 복사 잘라내기 (C) + 잘라내기 + 자동 잘라내기 선택도구 (ESC) 잘라내기 삭제 @@ -302,7 +304,7 @@ ${hostname} PC명 카운터 더하기 (I) 설명선 더하기(S) - 크기조정 + 크기조정 (Z) 크기조정 설정 종횡비 유지 너비 diff --git a/src/Greenshot/Languages/language-lt-LT.xml b/src/Greenshot/Languages/language-lt-LT.xml index e84388901..9b1089811 100644 --- a/src/Greenshot/Languages/language-lt-LT.xml +++ b/src/Greenshot/Languages/language-lt-LT.xml @@ -61,6 +61,7 @@ Dėkojame už pagalbą :) Kopijuoti pilną failo vardą Коpijuoti Iškirpti (C) + Iškirpti Objektų pasirinkimas (ESC) Apkirpti Naikinti diff --git a/src/Greenshot/Languages/language-lv-LV.xml b/src/Greenshot/Languages/language-lv-LV.xml index c74e41326..dea057944 100644 --- a/src/Greenshot/Languages/language-lv-LV.xml +++ b/src/Greenshot/Languages/language-lv-LV.xml @@ -92,6 +92,8 @@ Mēs būtu Tev pateicīgi, ja Tu vispirms pārbaudītu, vai kāds cits jau nav z Ievietot ceļu starpliktuvē Kopēt Apcirst (C) + Apcirst + Automātiski apcirst Atlases rīks (ESC) Izgriezt Izdzēst @@ -304,7 +306,7 @@ Arī bez karstiem taustiņiem visas darbības iespējams veikt izmantojot „Gre Pievienot skaitli (I) Pievienot teksta norādi (S) - Mainīt izmēru + Mainīt izmēru (Z) Izmēra maiņas iestatījumi Saglabāt izmēru attiecības Platums diff --git a/src/Greenshot/Languages/language-nl-NL.xml b/src/Greenshot/Languages/language-nl-NL.xml index 52e12a895..d640b0a42 100644 --- a/src/Greenshot/Languages/language-nl-NL.xml +++ b/src/Greenshot/Languages/language-nl-NL.xml @@ -93,6 +93,8 @@ Controleer ook even of dit probleem mogelijk al gemeld is! Gebruik de zoekfuncti Locatie naar klembord kopiëren Kopiëren Bijsnijden (C) + Bijsnijden + Automatisch bijsnijden Selectiegereedschap (ESC) Knippen Verwijderen @@ -305,7 +307,7 @@ Alle Greenshot functies werken ook zonder sneltoetsen via het context menu.Teller toevoegen (I) Tekstballon toevoegen (S) - Grootte + Grootte (Z) Vergrotingsinstellingen Verhouding behouden Breedte diff --git a/src/Greenshot/Languages/language-nn-NO.xml b/src/Greenshot/Languages/language-nn-NO.xml index 003b11b9a..edd8f31e7 100644 --- a/src/Greenshot/Languages/language-nn-NO.xml +++ b/src/Greenshot/Languages/language-nn-NO.xml @@ -80,6 +80,8 @@ Me sett òg pris på om du ved hjelp av søkefunksjonen på sida kan sjekke om d Kopier filstigen til utklyppstavla Kopier Skjer bildet [C] + Skjer bildet + Auto-skjer Peikarverktøy [Esc] Klypp ut Slett diff --git a/src/Greenshot/Languages/language-pl-PL.xml b/src/Greenshot/Languages/language-pl-PL.xml index 54e2fd993..7f908dba8 100644 --- a/src/Greenshot/Languages/language-pl-PL.xml +++ b/src/Greenshot/Languages/language-pl-PL.xml @@ -93,6 +93,8 @@ Będziemy wdzięczni, jeśli najpierw sprawdzisz, czy takie zdarzenie nie zosta Kopiuj ścieżkę do schowka Kopiuj Przytnij (C) + Przytnij (C) + Przytnij automatycznie Narzędzie wyboru (ESC) Wytnij Usuń diff --git a/src/Greenshot/Languages/language-pt-BR.xml b/src/Greenshot/Languages/language-pt-BR.xml index 8bfd938ed..e53603ccc 100644 --- a/src/Greenshot/Languages/language-pt-BR.xml +++ b/src/Greenshot/Languages/language-pt-BR.xml @@ -89,6 +89,7 @@ Copiar o caminho da pasta atual do arquivo para a Área de transferência Copiar Cortar (C) + Cortar Ferramenta de Seleção (ESC) Cortar Apagar diff --git a/src/Greenshot/Languages/language-pt-PT.xml b/src/Greenshot/Languages/language-pt-PT.xml index dabc42762..4da21743d 100644 --- a/src/Greenshot/Languages/language-pt-PT.xml +++ b/src/Greenshot/Languages/language-pt-PT.xml @@ -92,6 +92,8 @@ Também apreciaremos muito se puder verificar se não existe já um relatório d Copiar atalho para a Área de transferência Copiar Recortar (C) + Recortar + Recortar auto Ferramenta de Selecção (ESC) Cortar Eliminar @@ -303,7 +305,7 @@ Todas as funcionalidades do Greenshot funcionam directamente através do menu de Adicionar contador (I) Adicionar balão de texto (S) - Redimensionar + Redimensionar (Z) Definições de Redimensionamento Manter proporções Largura diff --git a/src/Greenshot/Languages/language-ro-RO.xml b/src/Greenshot/Languages/language-ro-RO.xml index 7e67ecb52..02fe86c3f 100644 --- a/src/Greenshot/Languages/language-ro-RO.xml +++ b/src/Greenshot/Languages/language-ro-RO.xml @@ -471,6 +471,9 @@ timpul curent, ex. 11_58_32 (plus extensia fișierului definită în setări) Taie (C) + + Taie + Deschide imaginea din clipboard diff --git a/src/Greenshot/Languages/language-ru-RU.xml b/src/Greenshot/Languages/language-ru-RU.xml index 42d85df80..f9973f349 100644 --- a/src/Greenshot/Languages/language-ru-RU.xml +++ b/src/Greenshot/Languages/language-ru-RU.xml @@ -93,6 +93,8 @@ Greenshot поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Копировать путь в буфер обмена Копировать Обрезка (C) + Обрезка + Автообрезка Инструмент «Выделение» (ESC) Вырезать Удалить diff --git a/src/Greenshot/Languages/language-sk-SK.xml b/src/Greenshot/Languages/language-sk-SK.xml index f47c2bd5b..01c68e9ed 100644 --- a/src/Greenshot/Languages/language-sk-SK.xml +++ b/src/Greenshot/Languages/language-sk-SK.xml @@ -80,6 +80,8 @@ Tiež by sme velmi ocenili, keby ste najskôr skontrolovali, či už neexistuje Kopírovať cestu do schránky Kopírovať Orezať (C) + Orezať + Automatické orezanie Nástroj pre výber (ESC) Vystrihnúť Zmazať diff --git a/src/Greenshot/Languages/language-sl-SI.xml b/src/Greenshot/Languages/language-sl-SI.xml index fd0dc2bc4..ac102397a 100644 --- a/src/Greenshot/Languages/language-sl-SI.xml +++ b/src/Greenshot/Languages/language-sl-SI.xml @@ -78,6 +78,8 @@ Pred objavo preverite tudi ali je napaka že prijavlja s strani kakšnega drugeg Kopiraj pot na odložišče Kopiraj Obreži (C) + Obreži + Samodejno obreži Orodje za izbor (ESC) Kopiraj Briši diff --git a/src/Greenshot/Languages/language-sr-RS.xml b/src/Greenshot/Languages/language-sr-RS.xml index 6b624dd9c..9c669dba8 100644 --- a/src/Greenshot/Languages/language-sr-RS.xml +++ b/src/Greenshot/Languages/language-sr-RS.xml @@ -78,6 +78,8 @@ Умножи путању Умножи Опсеци (C) + Опсеци + Аутоматско опсецање Алатка за одабир (ESC) Исеци Обриши diff --git a/src/Greenshot/Languages/language-sv-SE.xml b/src/Greenshot/Languages/language-sv-SE.xml index 3fe2df709..c5b1517e2 100644 --- a/src/Greenshot/Languages/language-sv-SE.xml +++ b/src/Greenshot/Languages/language-sv-SE.xml @@ -93,6 +93,8 @@ Innan du skickar uppskattar vi verkligen om du kontrollerar om felet redan blivi Kopiera sökväg till urklipp Kopiera Beskär (C) + Beskär + Autobeskärning Markeringsverktyg (ESC) Klipp ut Radera @@ -303,7 +305,7 @@ Alla Greenshots funktioner fungerar fortfarande från snabbmenyn i aktivitetsfä Lägg till räknare Lägg till pratbubbla - Anpassa storlek + Anpassa storlek (Z) Storleksinställningar Behåll bildförhållande Bredd diff --git a/src/Greenshot/Languages/language-tr-TR.xml b/src/Greenshot/Languages/language-tr-TR.xml index b5a43f083..56011063c 100644 --- a/src/Greenshot/Languages/language-tr-TR.xml +++ b/src/Greenshot/Languages/language-tr-TR.xml @@ -78,6 +78,8 @@ Ayrıca bu hata için bir izleyici kaydının açılmış olup olmadığını da Yolu panoya kopyala Kopyala Kırp (C) + Kırp + Otomatik kırpma Seçim Aracı (ESC) Kes Sil diff --git a/src/Greenshot/Languages/language-uk-UA.xml b/src/Greenshot/Languages/language-uk-UA.xml index 850a5ea7f..057927676 100644 --- a/src/Greenshot/Languages/language-uk-UA.xml +++ b/src/Greenshot/Languages/language-uk-UA.xml @@ -92,6 +92,8 @@ Greenshot постачається АБСОЛЮТНО БЕЗ ГАРАНТІЇ. Копіювати шлях у буфер обміну Копіювати Обрізати (С) + Обрізати + Автоматичне обрізання Інструмент вибору (Esc) Вирізати Видалити @@ -304,7 +306,7 @@ ${hostname} назва комп’ютера Додати лічильник (Ш) Додати словесну бульбашку (І) - Змінити розмір + Змінити розмір (Z) Параметри зміни розміру Зберігати пропорції Ширина diff --git a/src/Greenshot/Languages/language-vi-VN.xml b/src/Greenshot/Languages/language-vi-VN.xml index a4b1a73c2..6ddfc7f9d 100644 --- a/src/Greenshot/Languages/language-vi-VN.xml +++ b/src/Greenshot/Languages/language-vi-VN.xml @@ -58,6 +58,7 @@ Chép đuờng dẫn tới clipboard. Chép Cắt (C) + Cắt Công cụ chọn (ESC) Cắt Xóa diff --git a/src/Greenshot/Languages/language-zh-CN.xml b/src/Greenshot/Languages/language-zh-CN.xml index 7325fff33..e69489c8c 100644 --- a/src/Greenshot/Languages/language-zh-CN.xml +++ b/src/Greenshot/Languages/language-zh-CN.xml @@ -84,6 +84,8 @@ 复制路径到剪贴板 复制 裁剪 (C) + 裁剪 + 自动裁剪 选择工具 (ESC) 剪切 刪除物件 diff --git a/src/Greenshot/Languages/language-zh-TW.xml b/src/Greenshot/Languages/language-zh-TW.xml index da3881d2c..63f8fce2f 100644 --- a/src/Greenshot/Languages/language-zh-TW.xml +++ b/src/Greenshot/Languages/language-zh-TW.xml @@ -93,6 +93,8 @@ Greenshot 不對這個程式做任何擔保。這個程式是自由軟體,您 複製路徑到剪貼簿 複製 裁剪 (C) + 裁剪 + 自動裁剪 選取工具 (ESC) 剪下 刪除 @@ -305,7 +307,7 @@ Greenshot 所有功能仍然可以直接從通知區圖示的內容功能表動 加入計數器 (I) 加入對話框 (S) - 縮放 + 縮放 (Z) 縮放設定 維持長寬比 長度