SIL.Scripture 18.0.0-beta0043

Prefix Reserved
This is a prerelease version of SIL.Scripture.
dotnet add package SIL.Scripture --version 18.0.0-beta0043
                    
NuGet\Install-Package SIL.Scripture -Version 18.0.0-beta0043
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SIL.Scripture" Version="18.0.0-beta0043" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SIL.Scripture" Version="18.0.0-beta0043" />
                    
Directory.Packages.props
<PackageReference Include="SIL.Scripture" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add SIL.Scripture --version 18.0.0-beta0043
                    
#r "nuget: SIL.Scripture, 18.0.0-beta0043"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package SIL.Scripture@18.0.0-beta0043
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=SIL.Scripture&version=18.0.0-beta0043&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=SIL.Scripture&version=18.0.0-beta0043&prerelease
                    
Install as a Cake Tool

SIL.Scripture provides classes for working with Scripture data such as references and versifications.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 is compatible.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on SIL.Scripture:

Package Downloads
SIL.DblBundle

SIL.DblBundle provides classes for building a Digital Bible Library (DBL) bundle.

SIL.Windows.Forms.Scripture

SIL.Windows.Forms.Scripture contains Windows Forms UI elements for displaying Scripture.

ParatextData

Dll for use by third party applications needing to access Paratext's data. Compatible with SIL.Lib 12.0.x (required). Backwards compatible with data from Paratext 8.0 and 9.x. NOTE: This version of ParatextData is built using a AnyCPU configuration, but certain projects will not open correctly when run as 32-bit because of dependencies on native 64-bit libraries.

SIL.Scripture.Tests

Unit tests for SIL.Scripture

SIL.Machine

A natural language processing library for .NET that is focused on providing tools for resource-poor languages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on SIL.Scripture:

Repository Stars
sillsdev/FieldWorks
FieldWorks is a suite of software tools for language and cultural data, with support for complex scripts.
Version Downloads Last Updated
18.0.0-beta0043 36 9/25/2026
18.0.0-beta0042 98 9/23/2026
18.0.0-beta0041 156 9/17/2026
18.0.0-beta0040 154 9/17/2026
18.0.0-beta0039 151 9/14/2026
18.0.0-beta0038 159 9/14/2026
18.0.0-beta0037 169 9/10/2026
18.0.0-beta0036 177 9/10/2026
18.0.0-beta0035 167 8/28/2026
18.0.0-beta0034 175 8/27/2026
18.0.0-beta0033 176 8/27/2026
18.0.0-beta0032 178 8/6/2026
18.0.0-beta0031 184 8/6/2026
18.0.0-beta0030 658 7/17/2026
18.0.0-beta0029 209 7/15/2026
18.0.0-beta0028 211 7/10/2026
18.0.0-beta0027 680 7/1/2026
18.0.0-beta0026 197 6/29/2026
18.0.0-beta0025 245 6/26/2026
17.0.0 7,432 2/2/2026
Loading failed

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