SIL.Windows.Forms.Scripture
18.0.0-beta0043
Prefix Reserved
dotnet add package SIL.Windows.Forms.Scripture --version 18.0.0-beta0043
NuGet\Install-Package SIL.Windows.Forms.Scripture -Version 18.0.0-beta0043
<PackageReference Include="SIL.Windows.Forms.Scripture" Version="18.0.0-beta0043" />
<PackageVersion Include="SIL.Windows.Forms.Scripture" Version="18.0.0-beta0043" />
<PackageReference Include="SIL.Windows.Forms.Scripture" />
paket add SIL.Windows.Forms.Scripture --version 18.0.0-beta0043
#r "nuget: SIL.Windows.Forms.Scripture, 18.0.0-beta0043"
#:package SIL.Windows.Forms.Scripture@18.0.0-beta0043
#addin nuget:?package=SIL.Windows.Forms.Scripture&version=18.0.0-beta0043&prerelease
#tool nuget:?package=SIL.Windows.Forms.Scripture&version=18.0.0-beta0043&prerelease
SIL.Windows.Forms.Scripture contains Windows Forms UI elements for displaying Scripture.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
-
.NETFramework 4.6.2
- Markdig.Signed (>= 0.37.0)
- SIL.Core (>= 18.0.0-beta0043)
- SIL.Scripture (>= 18.0.0-beta0043)
- SIL.Windows.Forms (>= 18.0.0-beta0043)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
-
.NETFramework 4.8
- Markdig.Signed (>= 0.37.0)
- SIL.Core (>= 18.0.0-beta0043)
- SIL.Scripture (>= 18.0.0-beta0043)
- SIL.Windows.Forms (>= 18.0.0-beta0043)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 18.0.0-beta0043 | 0 | 9/25/2026 |
| 18.0.0-beta0042 | 60 | 9/23/2026 |
| 18.0.0-beta0041 | 86 | 9/17/2026 |
| 18.0.0-beta0040 | 76 | 9/17/2026 |
| 18.0.0-beta0039 | 84 | 9/14/2026 |
| 18.0.0-beta0038 | 91 | 9/14/2026 |
| 18.0.0-beta0037 | 95 | 9/10/2026 |
| 18.0.0-beta0036 | 93 | 9/10/2026 |
| 18.0.0-beta0035 | 94 | 8/28/2026 |
| 18.0.0-beta0034 | 89 | 8/27/2026 |
| 18.0.0-beta0033 | 94 | 8/27/2026 |
| 18.0.0-beta0032 | 103 | 8/6/2026 |
| 18.0.0-beta0031 | 99 | 8/6/2026 |
| 18.0.0-beta0030 | 103 | 7/17/2026 |
| 18.0.0-beta0029 | 109 | 7/15/2026 |
| 18.0.0-beta0028 | 106 | 7/10/2026 |
| 18.0.0-beta0027 | 113 | 7/1/2026 |
| 18.0.0-beta0026 | 114 | 6/29/2026 |
| 18.0.0-beta0025 | 142 | 6/26/2026 |
| 17.0.0 | 188 | 2/2/2026 |
Changes since version 17.0.0
Added:
- [SIL.Core] Added `UnixFilePermissions`, which reads and applies the Unix permission bits of a file and does nothing on platforms that have no such bits, so callers need no platform test of their own.
- [SIL.Windows.Forms.Archiving, SIL.Windows.Forms.DblBundle] Added `net8.0-windows` target.
- [SIL.Core.Desktop] Added a constant (kBrowserCompatibleUserAgent) to RobustNetworkOperation: a browser-like User Agent string that can be used when making HTTP requests to strict servers.
- [SIL.Core] Added an Exception property to NonFatalErrorReportExpected to return the previous reported non-fatal exception.
- [SIL.Media] Added a static PlaybackErrorMessage property to AudioFactory and a public const, kDefaultPlaybackErrorMessage, that will be used as the default message if the client does not set PlaybackErrorMessage.
- [SIL.Windows.Forms] Added KeysExtensions class with the IsNavigationKey extension method.
- [SIL.Core.Desktop] Added IAnalyticsConsent interface.
- [SIL.Windows.Forms.Privacy] Added AnalyticsConsent class, a Registry-based opt-out implementation of IAnalyticsConsent.
- [SIL.Windows.Forms.Privacy] Added PrivacyDlg as a new standard dialog to allow user to control whether analytics tracking is allowed.
- [SIL.Installer] Added new package for common installer components. Initially, this includes a Privacy dialog and code to access the registry entries so users can opt out of analytics data collection.
- [SIL.Core] Added PathUtilities.ParentDirectories extension method.
- [SIL.Core] Added FileLocationUtilities.DistFilesFolderPath property.
- [SIL.Core.Clearshare] Added `MetadataCore.RunUnderTagLibLock(Action)` and `RunUnderTagLibLock<T>(Func<T>)` so callers that use TagLib directly can serialize that access against ClearShare's own metadata reading and writing.
- [SIL.Windows.Forms] Added `SettingsProtectionHelper.SetSettingsProtection` overloads taking a `keepHidden` parameter, so a `Control` or `ToolStripItem` can be marked always-hidden: it stays hidden even while Ctrl+Shift is held to reveal the other protected components. The existing two-parameter overloads are unchanged.
Fixed:
- [SIL.Core] `GlobalMutex` (Windows, and macOS and other platforms that use a named `Mutex`) now recovers from `AbandonedMutexException` in both `Lock()` and `InitializeAndLock()` instead of propagating it, and emits a `Trace.TraceWarning` on recovery. Per the .NET `Mutex` contract the calling thread owns the mutex despite the exception, so the previous behavior aborted a caller that in fact held the lock, and a caller that died on it abandoned the mutex again -- making every later acquisition throw until the last handle closed or the machine was rebooted (FieldWorks LT-21834 and a related shutdown crash). New `Lock(out bool wasAbandoned)` and `InitializeAndLock(out bool createdNew, out bool wasAbandoned)` overloads report the abandonment so callers can revalidate data a dead holder may have left partially written; existing signatures are unchanged. Neither the Linux (`flock`) nor the local-only (`Monitor`) adapter can detect an abandonment, so both always report `false`. That is not the same as none occurring: each takes a `Monitor`, which the CLR does not release when the thread holding it exits, so a dead owner leaves it held and a later waiter blocks rather than being told anything.
- [SIL.WritingSystems] `GlobalWritingSystemRepository` and the SLDR cache now build a file's new contents alongside the old one and swap the two, instead of writing over the live file. Both stores are guarded by a machine-wide mutex that a dying process can abandon, so an interrupted write could leave a definition truncated or, in `GlobalWritingSystemRepository.SaveDefinition`, missing entirely. The previous contents now survive an interrupted write. Where a file system cannot replace one file with another and the target has to be copied over, the contents being displaced are kept beside it until the copy completes, and put back if it does not. Each replacement is built at a path unique to the call, so writers sharing a directory cannot collide on it, and a target that appears after it was found absent is replaced rather than throwing, which used to abandon every writing system still queued behind it.
- [SIL.WritingSystems] `Sldr.GetLdmlFile` delivers an entry to the caller by building it beside their file and swapping it in, rather than copying straight onto it. The caller has no second copy of that file, so an interrupted copy left them with neither their own definition nor a complete one.
- [SIL.WritingSystems] In the SLDR cache, an approved entry supersedes the uid-qualified entry it came from only once the replacement is in place, so an interrupted update can no longer leave the cache with neither, and failing to remove the superseded entry no longer fails the update. `DownloadLanguageTags` records the ETag only after the downloaded tags are in place: recording it first could mark a truncated file as current, and a present file whose ETag matches is never re-fetched.
- [SIL.WritingSystems] Files these stores leave in place keep the permissions they were written with rather than whichever the file system happens to carry over, so a definition or cache entry stays as editable by the group as it was. A writing system seeded from a template is rebuilt rather than copied, since copying carries the template's own permissions, and the SLDR cache entry is built under the shared store's mask.
- [SIL.WritingSystems] Both SLDR cache writers are written through rather than buffered, since the swap that follows is a rename and can complete before the data blocks reach the disk. Whether they actually do is a property of the operating system and the disk, so it is not something a test here can assert.
- [SIL.WritingSystems] A writing system that could not be written to the store stays marked as changed instead of being reported as stored, so a later `Save` tries again rather than the edit being discarded silently.
- [SIL.Core.Clearshare and SIL.Windows.Forms.Clearshare] Made image-metadata reading and writing thread-safe. TagLib#'s `XmpTag` keeps mutable static state (a shared `NameTable` and the `NamespacePrefixes` dictionary) with no internal locking; concurrent metadata operations could corrupt it and then make every subsequent metadata call throw "Operations that change non-concurrent collections must have exclusive access." for the life of the process. All TagLib access is now serialized behind a single process-wide lock.
- [SIL.Windows.Forms] Fixed `Interop.WIA.dll` deployment to provide the AnyCPU build to 64-bit (x64/AnyCPU) consumers instead of the 32-bit-only build.
- [SIL.Core.ClearShare] Fixed `MetadataCore.GetSummaryParagraph` appending the Creator line twice and conditionally appending `RightsStatement` twice when using `CustomLicenseInfo`.
- [SIL.Core] Fixed FontAnalytics exception handling to preserve original stack traces in debug mode.
- [SIL.Windows.Forms.WritingSystems] WritingSystemFromWindowsLocaleProvider no longer crashes when an installed input language has a corrupt Windows installation; it now skips languages whose keyboard layout name cannot be read instead of throwing.
- [SIL.Windows.Forms] Updated ImageToolbox UI to consistently use "image" (not "picture").
- [SIL.Windows.Forms.Keyboarding] Removed Timer-based deferred IME conversion status restore from WindowsKeyboardSwitchingAdapter, which disrupted active Chinese Pinyin IME compositions (LT-22442). Added diagnostic tracing for keyboard switching and IME state.
- [SIL.Windows.Forms] Fixed ImageCropper crash caused by its `Application.Idle` handler never being unsubscribed, so it could fire on a disposed instance
- [SIL.Windows.Forms] Fixed ImageCropper not downscaling tall images before cropping (height condition was checking width)
- [SIL.Windows.Forms] Fixed ImageCropper leaking the temp file and cropping bitmap built for the previous image each time it is given a new one to crop
- [SIL.Windows.Forms] BREAKING CHANGE: Fixed ImageCropper returning a cropped JPEG backed by a `MemoryStream` that had already been disposed, so any later use of the crop (including re-cropping it) failed with a generic GDI+ error. `GetCroppedImage` now returns the cropped bitmap directly, so its `RawFormat` is `MemoryBmp` rather than `Jpeg` and callers that read `RawFormat`, or that call `Image.Save(path)` on the result and rely on the JPEG encoder being chosen implicitly, must now pass an explicit `ImageFormat` (or go through `PalasoImage.Save(path)`, which picks the encoder from the file extension). `GetImage` is unaffected when nothing has been cropped: it now returns the image untouched instead of replacing it with a copy of itself round-tripped through a PNG temp file, so an uncropped image keeps its original format, bit depth and resolution
- [SIL.Media] BREAKING CHANGE (subtle and unlikely): WindowsAudioSession.OnPlaybackStopped now passes itself as the sender instead of a private implementation object, making the event arguments correct.
- [build] Fixed the update-language-data workflow so the generated pull request commit message shows the actual update date instead of a literal `$(date ...)` string.
- [SIL.Archiving] Fixed ArchiveAccessProtocol.GetDocumentationUri failing to create a missing documentation file because the resource lookup stripped the file extension and no longer matched the embedded resource name.
- [SIL.Windows.Forms.Archiving] Fixed formatting of message in ArchivingDlg so that the name of the auxiliary archive upload program (e.g., "RAMP") is displayed.
- [SIL.Windows.Forms] Fixed SettingsLauncherButton never disposing the SettingsProtectionHelper it creates, which left an enabled timer running after the button was disposed. Also removed the button's own unused visibility timer, which had no handler but was posting timer messages for the life of the control.
- [SIL.Windows.Forms] Fixed `SettingsProtectionHelper.Dispose` so that it only touches managed resources when disposing, is safe to call more than once, and no longer disposes the Ctrl+Shift timer explicitly (the timer is owned by the component container that disposes it).
- [SIL.WritingSystems] Fixed `GlobalWritingSystemRepository.Replace` silently failing to update a writing system, after several seconds of retries, when an earlier interrupted update had left a `.localrepoupdate` file behind. It now recovers from the interruption instead of failing on every later attempt, and no longer stalls when the writing system has no file on disk yet.
Changed:
- [SIL.Windows.Forms] PalasoImage robust load/save helpers now accept additional retry exception types without replacing the built-in retry defaults, and the built-in retry lists were expanded for additional read/save exceptions seen in the wild.
- [SIL.Windows.Forms.TestApp] Restored the Image Toolbox button in the test app dialog.
- [SIL.Core.Desktop, SIL.Windows.Forms, SIL.Windows.Forms.Keyboarding] Bump L10NSharp to 10.0.0-beta0004 to support SIL.Core.Desktop with target `netstandard2.0`; also updated the copyright to 2026 in each `AssemblyInfo.cs`.
- [SIL.Windows.Forms] BREAKING CHANGE: Removed optional moreSelected parameter from ToolStripExtensions.InitializeWithAvailableUILocales method. This parameter was no longer being used. Clients that want to have a More menu item that performs a custom action will now need to add it themselves.
- [SIL.Windows.Forms] BREAKING CHANGE: LocalizationIncompleteDlg's EmailAddressForLocalizationRequests is no longer autopopulated from LocalizationManager. A new optional constructor parameter, emailAddressForLocalizationRequests, can be used instead. If not supplied, the "More information" controls will be hidden.
- [SIL.Core.Desktop] Added an optional userAgentHeader parameter to DoHttpGetAndGetProxyInfo to allow a client to mimic a real browser if necessary.
- [SIL.Media] ISimpleAudioWithEvents now extends ISimpleAudioSession. Technically a breaking change, but the only class in this library that implements it already implemented ISimpleAudioSession. Any custom implementations by clients would very likely have implemented both as well.
- [SIL.Core] Changed the Message property on NonFatalErrorReportExpected (presumably intended for use only in tests) to return the message of the previous reported non-fatal exception if no ordninary non-fatal message has been reported.
- [SIL.Media] In the event of an audio playback error in Windows, the non-fatal exception reported will also include an accompanying (localizable/customizable) user-friendly message.
- [SIL.WritingSystems] Updated embedded langtags.json (api 1.4, 2026-06-09)
- [SIL.WritingSystems] Updated embedded ianaSubtagRegistry.txt (2026-06-14)
See full changelog at https://github.com/sillsdev/libpalaso/blob/master/CHANGELOG.md