Humanizr/Humanizer · error · InvalidOperationException
Locale '{localeCode}.headings' defines unsupported property
Error message
Locale '{localeCode}.headings' defines unsupported property '{property}'. Supported properties: full, short. What it means
The headings mapping accepts exactly two property names: 'full' and 'short'. Any additional key is unsupported because the heading set has a fixed schema, and the generator enumerates mapping keys to reject unknown properties early rather than silently ignoring them.
Source
Thrown at src/Humanizer.SourceGenerators/Common/LocaleYamlCatalog.cs:792
}
static HeadingSet? ResolveHeadings(
string localeCode,
ImmutableDictionary<string, SimpleYamlValue> features)
{
if (!features.TryGetValue("headings", out var headingValue))
{
return null;
}
if (headingValue is not SimpleYamlMapping mapping)
{
throw new InvalidOperationException($"Locale '{localeCode}.headings' must be a mapping.");
}
foreach (var property in mapping.Values.Keys.Where(static property => property is not ("full" or "short")))
{
throw new InvalidOperationException(
$"Locale '{localeCode}.headings' defines unsupported property '{property}'. Supported properties: full, short.");
}
return new HeadingSet(
ParseHeadingSequence(mapping, "full", localeCode),
ParseHeadingSequence(mapping, "short", localeCode));
}
static SimpleYamlMapping? ResolveCalendar(
string localeCode,
ImmutableDictionary<string, SimpleYamlValue> features)
{
return !features.TryGetValue("calendar", out var calendarValue)
? null
: calendarValue as SimpleYamlMapping
?? throw new InvalidOperationException($"Locale '{localeCode}.calendar' must be a mapping.");
}
View on GitHub (pinned to ffc2b77c0f)
Solutions
- Remove or rename the unsupported property so only 'full' and 'short' remain.
- If a narrower abbreviation is needed, place it under 'short:' and adjust the values.
- Double-check spelling: it must be exactly 'full' and 'short'.
Example fix
# before
headings:
full:
- January
medium:
- Jan
# after
headings:
full:
- January
short:
- Jan Defensive patterns
Strategy: validation
Validate before calling
import yaml, pathlib
locales_dir = pathlib.Path('src/Humanizer/Locales')
allowed = {'full', 'short'}
for f in locales_dir.rglob('*.yml'):
data = yaml.safe_load(f.read_text())
if isinstance(data, dict) and isinstance(data.get('headings'), dict):
extra = set(data['headings'].keys()) - allowed
if extra:
print(f'{f.name}: headings has unsupported keys: {extra}') Prevention
- Remember the headings schema accepts only 'full' and 'short' — no 'medium', 'narrow', or 'wide'.
- Avoid copying CLDR property names verbatim into the headings block.
- Add a schema lint that flags unknown headings keys.
When it happens
Trigger: A locale's 'headings:' mapping contains a key other than 'full' or 'short', such as 'medium', 'narrow', or a typo like 'ful'.
Common situations: Copy-pasting CLDR-style property names (narrow, medium) that this schema does not support; typos in property names; leftover experimental keys.
Related errors
- Locale '{localeCode}.headings' must be a mapping.
- Phrase section '{path}' must be a mapping.
- Phrase section '{path}' defines unsupported property '{key}'
- Feature '{featureName}' in locale '{localeCode}' must be a s
- Locale '{localeCode}.grammar' must be a mapping.
AI-assisted analysis of Humanizr/Humanizer@ffc2b77c0f (2026-08-13).
Data as JSON: /api/errors/663d3dfd91f7f3e8.
Report an issue: GitHub.