…e the wording
A warning was stored as one pre-joined string, `"upload.zip: This file contains no map data."`, and the host app had nothing to lay out but a sentence. Several files in one upload routinely fail the same way, so a reader got the same explanation repeated once per file, joined into a paragraph by `to_sentence`. Storing the pair instead lets a caller show the explanation once and list the files it covers.
Warnings are now also kept when an import fails. The transaction that recorded them rolls back with the `EmptyImportError`, so a failed import could previously only explain itself through the exception message — one unbroken paragraph, gone as soon as the job was cleared.
The messages themselves followed no single shape: two led with an em dash before naming the missing part, one spliced three clauses together before its first full stop, and one was written for a developer. They now follow one rule. Each says what is wrong with the file, and where it helps, what a valid file holds instead. None tells the reader what to do about it: the gem is handed a file and cannot know whether it was uploaded, fetched from a URL or configured by an administrator, so it cannot know what action is open to whoever reads the message. A host knows its own workflow and is the place to add one. Specifics that an em dash used to introduce sit in the first sentence or in parentheses, which is also how a skipped layer's name now reads.
The file is the subject of every message, never the reader and never the library. A gem has no voice to speak in and cannot know who is reading, so `"This isn't a file type we can read."` becomes `"This file type is not supported."` and `"Please upload a KMZ..."` becomes `"Supported formats are KMZ..."`.
The encoding error, which disagreed with itself grammatically (`One or more features ... has`) and spelled unsupported with a hyphen, now names the encoding a file needs instead. `Invalid KML document (root node was 'Folder')` was developer-facing — it now names the root element in a sentence a submitter can read.
`INVALID_ARCHIVE` changes from "This file doesn't contain any map data." to "This file contains no map data.", and `SUPPORTED_FORMATS` from "Please upload a KMZ, ..." to "Upload a KMZ, ...", so a caller matching on either text needs updating.
The README gains an `Upgrading From 3.11 to 3.12` section, the way every earlier breaking change in this gem has been documented. It covers the return type, the pre-joined strings a caller will still meet in records stored before the upgrade, and the one-liner that rebuilds the 3.11 sentence for a caller that wants to keep rendering one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>